diff --git a/Makefile b/Makefile index 524175c2..5db623f0 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -# Makefile driver for SWH Python modules. DO NOT CHANGE. +# Makefile driver for swh Python modules. DO NOT CHANGE. # You can add custom Makefile rules to Makefile.local include ../Makefile.python -include Makefile.local diff --git a/PKG-INFO b/PKG-INFO index c8a25acb..7e118943 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,127 +1,127 @@ Metadata-Version: 2.1 Name: swh.web -Version: 0.0.167 +Version: 0.0.168 Summary: Software Heritage Web UI Home-page: https://forge.softwareheritage.org/diffusion/DWUI/ Author: Software Heritage developers Author-email: swh-devel@inria.fr License: UNKNOWN Project-URL: Bug Reports, https://forge.softwareheritage.org/maniphest Project-URL: Funding, https://www.softwareheritage.org/donate Project-URL: Source, https://forge.softwareheritage.org/source/swh-web Description: # swh-web This repository holds the development of Software Heritage web applications: - * SWH Web API (https://archive.softwareheritage.org/api): enables to query the content of the SWH archive through HTTP requests and get responses in JSON or YAML. + * swh-web API (https://archive.softwareheritage.org/api): enables to query the content of the archive through HTTP requests and get responses in JSON or YAML. - * SWH Web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the SWH archive. + * swh-web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the archive. Documentation about how to use these components but also the details of their URI schemes can be found in the docs folder. The produced HTML documentation can be read and browsed at https://docs.softwareheritage.org/devel/swh-web/index.html. ## Technical details Those applications are powered by: * [Django Web Framework](https://www.djangoproject.com/) on the backend side with the following extensions enabled: * [django-rest-framework](http://www.django-rest-framework.org/) * [django-webpack-loader](https://github.com/owais/django-webpack-loader) * [django-js-reverse](http://django-js-reverse.readthedocs.io/en/latest/) * [webpack](https://webpack.js.org/) on the frontend side for better static assets management, including: * assets dependencies management and retrieval through [npm](https://www.npmjs.com/) * linting of custom javascript code (through [eslint](https://eslint.org/)) and stylesheets (through [stylelint](https://stylelint.io/)) * use of [es6](http://es6-features.org) syntax and advanced javascript feature like [async/await](https://javascript.info/async-await) or [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) thanks to [babel](https://babeljs.io/) (es6 to es5 transpiler and polyfills provider) * assets minification (using [UglifyJS](https://github.com/mishoo/UglifyJS2) and [cssnano](http://cssnano.co/)) but also dead code elimination for production use ## How to build and run ### Requirements First you will need [Python 3](https://www.python.org) and a complete [swh development environment](https://forge.softwareheritage.org/source/swh-environment/) installed. To run the backend, you need to have the following Python 3 modules installed: * beautifulsoup4 * django >= 1.10.7 * djangorestframework >= 3.4.0 * django_webpack_loader * django_js_reverse * docutils * file_magic >= 0.3.0 * htmlmin * lxml * pygments * pypandoc * python-dateutil * pyyaml * requests To compile the frontend assets, you need to have [nodejs](https://nodejs.org/en/) >= 8.x (preferably version 8.x LTS) and [npm](https://www.npmjs.com/) (or [yarn](https://yarnpkg.com/en/)) installed. If you are on Debian stretch, you can easily install an up to date nodejs/npm from the stretch-backports repository or by following the instructions located at https://github.com/nodesource/distributions. Once you have installed nodejs, issue the following command in the root directory of swh-web in order to retrieve all the frontend dependencies: ``` $ npm install ``` or if you prefer to use yarn (faster than npm): ``` $ yarn install ``` Please note that the static assets bundles generated by webpack are not stored in the git repository. Follow the instructions below in order to generate them in order to be able to run the frontend part of the web applications. ### Make targets Below is the list of available make targets that can be executed from the root directory of swh-web in order to build and/or execute the web applications under various configurations: * **run-django-webpack-devserver**: Compile and serve not optimized (without mignification and dead code elimination) frontend static assets using [webpack-dev-server](https://github.com/webpack/webpack-dev-server) and run django server with development settings. This is the recommended target to use when developing swh-web as it enables automatic reloading of backend and frontend part of the applications when modifying source files (*.py, *.js, *.css, *.html). * **run-django-webpack-dev**: Compile not optimized (no minification, no dead code elimination) frontend static assets using webpack and run django server with development settings. This is the recommended target when one only wants to develop the backend side of the application. * **run-django-webpack-prod**: Compile optimized (with minification and dead code elimination) frontend static assets using webpack and run django server with production settings. This is useful to test the applications in production mode (with the difference that static assets are served by django). Production settings notably enable advanced django caching and you will need to have [memcached](https://memcached.org/) installed for that feature to work. * **run-django-server-dev**: Run the django server with development settings but without compiling frontend static assets through webpack. * **run-django-server-prod**: Run the django server with production settings but without compiling frontend static assets through webpack. * **run-gunicorn-server**: Run the web applications with production settings in a [gunicorn](http://gunicorn.org/) worker as they will be in real production environment. Once one of these targets executed, the web applications can be executed by pointing your browser to http://localhost:5004. ### Npm/Yarn targets Below is a list of available npm/yarn targets in order to only execute the frontend static assets compilation (no web server will be executed): * **build-dev**: compile not optimized (without mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. * **build**: compile optimized (with mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. **The build target must be executed prior performing the Debian packaging of swh-web** in order for the package to contain the optimized assets dedicated to production environment. To execute these targets, issue the following commmand: ``` $ npm run ``` or if you prefer using yarn: ``` $ yarn ``` Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: OS Independent Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django Description-Content-Type: text/markdown Provides-Extra: testing diff --git a/README.md b/README.md index b203ec39..42acbe3a 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,106 @@ # swh-web This repository holds the development of Software Heritage web applications: -* SWH Web API (https://archive.softwareheritage.org/api): enables to query the content of the SWH archive through HTTP requests and get responses in JSON or YAML. +* swh-web API (https://archive.softwareheritage.org/api): enables to query the content of the archive through HTTP requests and get responses in JSON or YAML. -* SWH Web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the SWH archive. +* swh-web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the archive. Documentation about how to use these components but also the details of their URI schemes can be found in the docs folder. The produced HTML documentation can be read and browsed at https://docs.softwareheritage.org/devel/swh-web/index.html. ## Technical details Those applications are powered by: * [Django Web Framework](https://www.djangoproject.com/) on the backend side with the following extensions enabled: * [django-rest-framework](http://www.django-rest-framework.org/) * [django-webpack-loader](https://github.com/owais/django-webpack-loader) * [django-js-reverse](http://django-js-reverse.readthedocs.io/en/latest/) * [webpack](https://webpack.js.org/) on the frontend side for better static assets management, including: * assets dependencies management and retrieval through [npm](https://www.npmjs.com/) * linting of custom javascript code (through [eslint](https://eslint.org/)) and stylesheets (through [stylelint](https://stylelint.io/)) * use of [es6](http://es6-features.org) syntax and advanced javascript feature like [async/await](https://javascript.info/async-await) or [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) thanks to [babel](https://babeljs.io/) (es6 to es5 transpiler and polyfills provider) * assets minification (using [UglifyJS](https://github.com/mishoo/UglifyJS2) and [cssnano](http://cssnano.co/)) but also dead code elimination for production use ## How to build and run ### Requirements First you will need [Python 3](https://www.python.org) and a complete [swh development environment](https://forge.softwareheritage.org/source/swh-environment/) installed. To run the backend, you need to have the following Python 3 modules installed: * beautifulsoup4 * django >= 1.10.7 * djangorestframework >= 3.4.0 * django_webpack_loader * django_js_reverse * docutils * file_magic >= 0.3.0 * htmlmin * lxml * pygments * pypandoc * python-dateutil * pyyaml * requests To compile the frontend assets, you need to have [nodejs](https://nodejs.org/en/) >= 8.x (preferably version 8.x LTS) and [npm](https://www.npmjs.com/) (or [yarn](https://yarnpkg.com/en/)) installed. If you are on Debian stretch, you can easily install an up to date nodejs/npm from the stretch-backports repository or by following the instructions located at https://github.com/nodesource/distributions. Once you have installed nodejs, issue the following command in the root directory of swh-web in order to retrieve all the frontend dependencies: ``` $ npm install ``` or if you prefer to use yarn (faster than npm): ``` $ yarn install ``` Please note that the static assets bundles generated by webpack are not stored in the git repository. Follow the instructions below in order to generate them in order to be able to run the frontend part of the web applications. ### Make targets Below is the list of available make targets that can be executed from the root directory of swh-web in order to build and/or execute the web applications under various configurations: * **run-django-webpack-devserver**: Compile and serve not optimized (without mignification and dead code elimination) frontend static assets using [webpack-dev-server](https://github.com/webpack/webpack-dev-server) and run django server with development settings. This is the recommended target to use when developing swh-web as it enables automatic reloading of backend and frontend part of the applications when modifying source files (*.py, *.js, *.css, *.html). * **run-django-webpack-dev**: Compile not optimized (no minification, no dead code elimination) frontend static assets using webpack and run django server with development settings. This is the recommended target when one only wants to develop the backend side of the application. * **run-django-webpack-prod**: Compile optimized (with minification and dead code elimination) frontend static assets using webpack and run django server with production settings. This is useful to test the applications in production mode (with the difference that static assets are served by django). Production settings notably enable advanced django caching and you will need to have [memcached](https://memcached.org/) installed for that feature to work. * **run-django-server-dev**: Run the django server with development settings but without compiling frontend static assets through webpack. * **run-django-server-prod**: Run the django server with production settings but without compiling frontend static assets through webpack. * **run-gunicorn-server**: Run the web applications with production settings in a [gunicorn](http://gunicorn.org/) worker as they will be in real production environment. Once one of these targets executed, the web applications can be executed by pointing your browser to http://localhost:5004. ### Npm/Yarn targets Below is a list of available npm/yarn targets in order to only execute the frontend static assets compilation (no web server will be executed): * **build-dev**: compile not optimized (without mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. * **build**: compile optimized (with mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. **The build target must be executed prior performing the Debian packaging of swh-web** in order for the package to contain the optimized assets dedicated to production environment. To execute these targets, issue the following commmand: ``` $ npm run ``` or if you prefer using yarn: ``` $ yarn ``` diff --git a/debian/changelog b/debian/changelog index e67374fa..2fefae4d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,1240 +1,1240 @@ -swh-web (0.0.167-1~swh1~bpo9+1) stretch-swh; urgency=medium +swh-web (0.0.168-1~swh1) unstable-swh; urgency=medium - * Rebuild for stretch-backports. + * version 0.0.168 - -- Antoine Lambert Mon, 12 Nov 2018 17:47:51 +0100 + -- Antoine Lambert Thu, 15 Nov 2018 15:24:28 +0100 swh-web (0.0.167-1~swh1) unstable-swh; urgency=medium * version 0.0.167 -- Antoine Lambert Mon, 12 Nov 2018 17:47:52 +0100 swh-web (0.0.166-1~swh1) unstable-swh; urgency=medium * version 0.0.166 -- Antoine Lambert Tue, 06 Nov 2018 13:31:08 +0100 swh-web (0.0.165-1~swh1) unstable-swh; urgency=medium * version 0.0.165 -- Antoine Lambert Wed, 31 Oct 2018 17:46:32 +0100 swh-web (0.0.164-1~swh1) unstable-swh; urgency=medium * version 0.0.164 -- Antoine Lambert Wed, 31 Oct 2018 17:38:39 +0100 swh-web (0.0.163-1~swh1) unstable-swh; urgency=medium * version 0.0.163 -- Antoine Lambert Wed, 31 Oct 2018 17:17:05 +0100 swh-web (0.0.162-1~swh1) unstable-swh; urgency=medium * version 0.0.162 -- Antoine Lambert Thu, 18 Oct 2018 17:57:52 +0200 swh-web (0.0.161-1~swh1) unstable-swh; urgency=medium * version 0.0.161 -- Antoine Lambert Wed, 17 Oct 2018 15:30:50 +0200 swh-web (0.0.160-1~swh1) unstable-swh; urgency=medium * version 0.0.160 -- Antoine Lambert Fri, 12 Oct 2018 15:28:05 +0200 swh-web (0.0.159-1~swh1) unstable-swh; urgency=medium * version 0.0.159 -- Antoine Lambert Fri, 12 Oct 2018 10:18:46 +0200 swh-web (0.0.158-1~swh1) unstable-swh; urgency=medium * version 0.0.158 -- Antoine Lambert Thu, 11 Oct 2018 17:49:17 +0200 swh-web (0.0.157-1~swh1) unstable-swh; urgency=medium * version 0.0.157 -- Antoine Lambert Thu, 27 Sep 2018 17:21:28 +0200 swh-web (0.0.156-1~swh1) unstable-swh; urgency=medium * version 0.0.156 -- Antoine Lambert Thu, 20 Sep 2018 14:40:37 +0200 swh-web (0.0.155-1~swh1) unstable-swh; urgency=medium * version 0.0.155 -- Antoine Lambert Tue, 18 Sep 2018 10:44:38 +0200 swh-web (0.0.154-1~swh1) unstable-swh; urgency=medium * version 0.0.154 -- Antoine Lambert Fri, 14 Sep 2018 16:37:48 +0200 swh-web (0.0.153-1~swh1) unstable-swh; urgency=medium * version 0.0.153 -- Antoine Lambert Wed, 12 Sep 2018 16:44:06 +0200 swh-web (0.0.152-1~swh1) unstable-swh; urgency=medium * version 0.0.152 -- Antoine Lambert Wed, 12 Sep 2018 16:04:47 +0200 swh-web (0.0.151-1~swh1) unstable-swh; urgency=medium * version 0.0.151 -- Antoine Lambert Tue, 04 Sep 2018 17:28:46 +0200 swh-web (0.0.150-1~swh1) unstable-swh; urgency=medium * version 0.0.150 -- Antoine Lambert Tue, 04 Sep 2018 15:15:05 +0200 swh-web (0.0.149-1~swh1) unstable-swh; urgency=medium * version 0.0.149 -- Antoine Lambert Thu, 30 Aug 2018 16:23:05 +0200 swh-web (0.0.148-1~swh1) unstable-swh; urgency=medium * version 0.0.148 -- Antoine Lambert Thu, 30 Aug 2018 11:27:42 +0200 swh-web (0.0.147-1~swh1) unstable-swh; urgency=medium * version 0.0.147 -- Antoine Lambert Fri, 03 Aug 2018 14:41:04 +0200 swh-web (0.0.146-1~swh1) unstable-swh; urgency=medium * version 0.0.146 -- Antoine Lambert Fri, 27 Jul 2018 16:37:33 +0200 swh-web (0.0.145-1~swh1) unstable-swh; urgency=medium * version 0.0.145 -- Antoine Lambert Fri, 27 Jul 2018 16:10:36 +0200 swh-web (0.0.144-1~swh1) unstable-swh; urgency=medium * version 0.0.144 -- Antoine Lambert Fri, 20 Jul 2018 16:26:52 +0200 swh-web (0.0.143-1~swh1) unstable-swh; urgency=medium * version 0.0.143 -- Antoine Lambert Fri, 20 Jul 2018 16:19:56 +0200 swh-web (0.0.142-1~swh1) unstable-swh; urgency=medium * version 0.0.142 -- Antoine Lambert Fri, 20 Jul 2018 15:51:20 +0200 swh-web (0.0.141-1~swh1) unstable-swh; urgency=medium * version 0.0.141 -- Antoine Lambert Fri, 06 Jul 2018 14:11:39 +0200 swh-web (0.0.140-1~swh1) unstable-swh; urgency=medium * version 0.0.140 -- Antoine Lambert Fri, 29 Jun 2018 16:42:06 +0200 swh-web (0.0.139-1~swh1) unstable-swh; urgency=medium * version 0.0.139 -- Antoine Lambert Wed, 27 Jun 2018 16:47:17 +0200 swh-web (0.0.138-1~swh1) unstable-swh; urgency=medium * version 0.0.138 -- Antoine Lambert Wed, 13 Jun 2018 12:18:23 +0200 swh-web (0.0.137-1~swh1) unstable-swh; urgency=medium * version 0.0.137 -- Antoine Lambert Wed, 13 Jun 2018 11:52:05 +0200 swh-web (0.0.136-1~swh1) unstable-swh; urgency=medium * version 0.0.136 -- Antoine Lambert Tue, 05 Jun 2018 18:59:20 +0200 swh-web (0.0.135-1~swh1) unstable-swh; urgency=medium * version 0.0.135 -- Antoine Lambert Fri, 01 Jun 2018 17:47:58 +0200 swh-web (0.0.134-1~swh1) unstable-swh; urgency=medium * version 0.0.134 -- Antoine Lambert Thu, 31 May 2018 17:56:04 +0200 swh-web (0.0.133-1~swh1) unstable-swh; urgency=medium * version 0.0.133 -- Antoine Lambert Tue, 29 May 2018 18:13:59 +0200 swh-web (0.0.132-1~swh1) unstable-swh; urgency=medium * version 0.0.132 -- Antoine Lambert Tue, 29 May 2018 14:25:16 +0200 swh-web (0.0.131-1~swh1) unstable-swh; urgency=medium * version 0.0.131 -- Antoine Lambert Fri, 25 May 2018 17:31:58 +0200 swh-web (0.0.130-1~swh1) unstable-swh; urgency=medium * version 0.0.130 -- Antoine Lambert Fri, 25 May 2018 11:59:17 +0200 swh-web (0.0.129-1~swh1) unstable-swh; urgency=medium * version 0.0.129 -- Antoine Lambert Thu, 24 May 2018 18:28:48 +0200 swh-web (0.0.128-1~swh1) unstable-swh; urgency=medium * version 0.0.128 -- Antoine Lambert Wed, 16 May 2018 13:52:33 +0200 swh-web (0.0.127-1~swh1) unstable-swh; urgency=medium * version 0.0.127 -- Antoine Lambert Fri, 04 May 2018 19:14:58 +0200 swh-web (0.0.126-1~swh1) unstable-swh; urgency=medium * version 0.0.126 -- Antoine Lambert Fri, 04 May 2018 15:29:49 +0200 swh-web (0.0.125-1~swh1) unstable-swh; urgency=medium * version 0.0.125 -- Antoine Lambert Fri, 20 Apr 2018 15:45:05 +0200 swh-web (0.0.124-1~swh1) unstable-swh; urgency=medium * version 0.0.124 -- Antoine Lambert Fri, 20 Apr 2018 14:46:00 +0200 swh-web (0.0.123-1~swh1) unstable-swh; urgency=medium * version 0.0.123 -- Antoine Lambert Mon, 26 Mar 2018 11:34:32 +0200 swh-web (0.0.122-1~swh1) unstable-swh; urgency=medium * version 0.0.122 -- Antoine Lambert Wed, 14 Mar 2018 17:23:15 +0100 swh-web (0.0.121-1~swh1) unstable-swh; urgency=medium * version 0.0.121 -- Antoine Lambert Wed, 07 Mar 2018 18:02:29 +0100 swh-web (0.0.120-1~swh1) unstable-swh; urgency=medium * version 0.0.120 -- Antoine Lambert Wed, 07 Mar 2018 17:31:08 +0100 swh-web (0.0.119-1~swh1) unstable-swh; urgency=medium * version 0.0.119 -- Antoine Lambert Thu, 01 Mar 2018 18:11:40 +0100 swh-web (0.0.118-1~swh1) unstable-swh; urgency=medium * version 0.0.118 -- Antoine Lambert Thu, 22 Feb 2018 17:26:28 +0100 swh-web (0.0.117-1~swh1) unstable-swh; urgency=medium * version 0.0.117 -- Antoine Lambert Wed, 21 Feb 2018 14:56:27 +0100 swh-web (0.0.116-1~swh1) unstable-swh; urgency=medium * version 0.0.116 -- Antoine Lambert Mon, 19 Feb 2018 17:47:57 +0100 swh-web (0.0.115-1~swh1) unstable-swh; urgency=medium * version 0.0.115 -- Antoine Lambert Mon, 19 Feb 2018 12:00:47 +0100 swh-web (0.0.114-1~swh1) unstable-swh; urgency=medium * version 0.0.114 -- Antoine Lambert Fri, 16 Feb 2018 16:13:58 +0100 swh-web (0.0.113-1~swh1) unstable-swh; urgency=medium * version 0.0.113 -- Antoine Lambert Thu, 15 Feb 2018 15:52:57 +0100 swh-web (0.0.112-1~swh1) unstable-swh; urgency=medium * version 0.0.112 -- Antoine Lambert Thu, 08 Feb 2018 12:10:44 +0100 swh-web (0.0.111-1~swh1) unstable-swh; urgency=medium * Release swh.web v0.0.111 * Support snapshot information in origin_visit -- Nicolas Dandrimont Tue, 06 Feb 2018 14:54:29 +0100 swh-web (0.0.110-1~swh1) unstable-swh; urgency=medium * version 0.0.110 -- Antoine Lambert Fri, 02 Feb 2018 15:52:10 +0100 swh-web (0.0.109-1~swh1) unstable-swh; urgency=medium * version 0.0.109 -- Antoine Lambert Thu, 01 Feb 2018 18:04:10 +0100 swh-web (0.0.108-1~swh1) unstable-swh; urgency=medium * version 0.0.108 -- Antoine Lambert Tue, 23 Jan 2018 17:31:13 +0100 swh-web (0.0.107-1~swh1) unstable-swh; urgency=medium * version 0.0.107 -- Antoine Lambert Tue, 23 Jan 2018 12:13:58 +0100 swh-web (0.0.106-1~swh1) unstable-swh; urgency=medium * version 0.0.106 -- Antoine Lambert Thu, 18 Jan 2018 15:28:44 +0100 swh-web (0.0.105-1~swh1) unstable-swh; urgency=medium * version 0.0.105 -- Antoine Lambert Tue, 09 Jan 2018 17:32:29 +0100 swh-web (0.0.104-1~swh1) unstable-swh; urgency=medium * version 0.0.104 -- Antoine Lambert Tue, 09 Jan 2018 14:29:32 +0100 swh-web (0.0.103-1~swh1) unstable-swh; urgency=medium * version 0.0.103 -- Antoine Lambert Thu, 04 Jan 2018 16:48:56 +0100 swh-web (0.0.102-1~swh1) unstable-swh; urgency=medium * version 0.0.102 -- Antoine Lambert Thu, 14 Dec 2017 15:13:22 +0100 swh-web (0.0.101-1~swh1) unstable-swh; urgency=medium * version 0.0.101 -- Antoine Pietri Fri, 08 Dec 2017 16:38:05 +0100 swh-web (0.0.100-1~swh1) unstable-swh; urgency=medium * v0.0.100 * swh.web.common.service: Read indexer data through the indexer * storage -- Antoine R. Dumont (@ardumont) Thu, 07 Dec 2017 16:25:12 +0100 swh-web (0.0.99-1~swh1) unstable-swh; urgency=medium * version 0.0.99 -- Antoine Lambert Wed, 06 Dec 2017 17:07:37 +0100 swh-web (0.0.98-1~swh1) unstable-swh; urgency=medium * version 0.0.98 -- Antoine Lambert Wed, 06 Dec 2017 15:41:13 +0100 swh-web (0.0.97-1~swh1) unstable-swh; urgency=medium * version 0.0.97 -- Antoine Lambert Fri, 24 Nov 2017 16:24:07 +0100 swh-web (0.0.96-1~swh1) unstable-swh; urgency=medium * version 0.0.96 -- Antoine Lambert Fri, 24 Nov 2017 15:22:16 +0100 swh-web (0.0.95-1~swh1) unstable-swh; urgency=medium * version 0.0.95 -- Antoine Lambert Thu, 09 Nov 2017 18:14:31 +0100 swh-web (0.0.94-1~swh1) unstable-swh; urgency=medium * version 0.0.94 -- Antoine Lambert Mon, 06 Nov 2017 16:19:48 +0100 swh-web (0.0.93-1~swh1) unstable-swh; urgency=medium * version 0.0.93 -- Antoine Lambert Fri, 27 Oct 2017 16:28:22 +0200 swh-web (0.0.92-1~swh1) unstable-swh; urgency=medium * version 0.0.92 -- Antoine Lambert Fri, 27 Oct 2017 16:07:47 +0200 swh-web (0.0.91-1~swh1) unstable-swh; urgency=medium * v0.0.91 -- Antoine Lambert Fri, 13 Oct 2017 20:40:07 +0200 swh-web (0.0.90-1~swh1) unstable-swh; urgency=medium * version 0.0.90 -- Antoine Lambert Wed, 04 Oct 2017 13:53:28 +0200 swh-web (0.0.89-1~swh1) unstable-swh; urgency=medium * version 0.0.89 -- Antoine Lambert Wed, 04 Oct 2017 10:42:11 +0200 swh-web (0.0.88-1~swh1) unstable-swh; urgency=medium * v0.0.88 * Fix default webapp configuration file lookup * Fix templating errors * Fix wrong default configuration * Add missing endpoint information about error (origin visit endpoint) -- Antoine R. Dumont (@ardumont) Wed, 13 Sep 2017 15:02:24 +0200 swh-web (0.0.87-1~swh1) unstable-swh; urgency=medium * v0.0.87 * throttling: permit the use to define cache server * throttling: improve configuration intent * configuration: Clarify config keys intent and improve config * management * docs: change content example to ls.c from GNU corutils * packaging: Fix dependency requirements -- Antoine R. Dumont (@ardumont) Tue, 12 Sep 2017 14:11:10 +0200 swh-web (0.0.86-1~swh1) unstable-swh; urgency=medium * v0.0.86 -- Antoine Lambert Fri, 08 Sep 2017 14:07:19 +0200 swh-web (0.0.85-1~swh1) unstable-swh; urgency=medium * v0.0.85 -- Antoine Lambert Fri, 08 Sep 2017 10:55:50 +0200 swh-web (0.0.84-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.84 * Prepare stretch packaging -- Nicolas Dandrimont Fri, 30 Jun 2017 18:18:55 +0200 swh-web (0.0.83-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.83 * Allow exemption by network for rate limiting -- Nicolas Dandrimont Wed, 24 May 2017 18:01:53 +0200 swh-web (0.0.82-1~swh1) unstable-swh; urgency=medium * v0.0.83 * Add new blake2s256 data column on content -- Antoine R. Dumont (@ardumont) Tue, 04 Apr 2017 16:54:25 +0200 swh-web (0.0.81-1~swh1) unstable-swh; urgency=medium * v0.0.81 * Migrate functions from swh.core.hashutil to swh.model.hashutil -- Antoine R. Dumont (@ardumont) Wed, 15 Mar 2017 16:26:42 +0100 swh-web (0.0.80-1~swh1) unstable-swh; urgency=medium * v0.0.80 * /api/1/content/raw/: Make no textual content request forbidden -- Antoine R. Dumont (@ardumont) Wed, 15 Mar 2017 12:35:43 +0100 swh-web (0.0.79-1~swh1) unstable-swh; urgency=medium * v0.0.79 * /api/1/content/raw/: Improve error msg when content not available * /api/1/content/raw/: Open endpoint documentation in api endpoints * index -- Antoine R. Dumont (@ardumont) Wed, 15 Mar 2017 11:43:00 +0100 swh-web (0.0.78-1~swh1) unstable-swh; urgency=medium * v0.0.78 * /api/1/content/raw/: Open endpoint to download only text-ish * contents (other contents are deemed unavailable) * /api/1/content/raw/: Permit the user to provide a 'filename' * parameter to name the downloaded contents as they see fit. -- Antoine R. Dumont (@ardumont) Wed, 15 Mar 2017 10:48:21 +0100 swh-web (0.0.77-1~swh1) unstable-swh; urgency=medium * v0.0.77 * API doc: add warning about API instability * API: Unify remaining dates as iso8601 string * /api/1/revision/: Merge 'parents' key into a dict list * /api/1/release/: Enrich output with author_url if author mentioned * packaging: split internal and external requirements in separate files -- Antoine R. Dumont (@ardumont) Tue, 21 Feb 2017 11:37:19 +0100 swh-web (0.0.76-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.76 * Refactor APIDoc to be more sensible * Share rate limits between all the api_ queries -- Nicolas Dandrimont Thu, 02 Feb 2017 17:32:57 +0100 swh-web (0.0.75-1~swh1) unstable-swh; urgency=medium * v0.0.75 * Remove build dependency on libjs-cryptojs, libjs-jquery-flot*, * libjs-jquery-datatables * views/browse,api: move main apidoc views to views/api -- Antoine R. Dumont (@ardumont) Thu, 02 Feb 2017 15:03:20 +0100 swh-web (0.0.74-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.74 * Various interface cleanups for API documentation * Return Error types in API error return values -- Nicolas Dandrimont Thu, 02 Feb 2017 11:03:56 +0100 swh-web (0.0.73-1~swh1) unstable-swh; urgency=medium * Deploy swh.web.ui v0.0.73 * Add a bazillion of style fixes. -- Nicolas Dandrimont Wed, 01 Feb 2017 22:44:10 +0100 swh-web (0.0.72-1~swh1) unstable-swh; urgency=medium * v0.0.72 * apidoc rendering: Improvments * apidoc: add usual copyright/license/contact footer * apidoc: show status code if != 200 * apidoc: hide /content/known/ from the doc * apidoc: document upcoming v. available in endpoint index * apidoc: vertically distantiate jquery search box and preceding text -- Antoine R. Dumont (@ardumont) Wed, 01 Feb 2017 18:34:56 +0100 swh-web (0.0.71-1~swh1) unstable-swh; urgency=medium * v0.0.71 * add static/robots.txt, disabling crawling of /api/ * re-root content-specific endpoints under /api/1/content/ * fix not converted empty bytes string * /revision/origin/: Make the timestamp default to the most recent visit * api: simplify HTML layout by dropping redundant nav and about page * apidoc: document correctly endpoints /content/known/, * /revision/{origin,origin/log}/ and /stat/counters/ -- Antoine R. Dumont (@ardumont) Wed, 01 Feb 2017 16:23:56 +0100 swh-web (0.0.70-1~swh1) unstable-swh; urgency=medium * v0.0.70 * apidoc: Review documentation for * endpoints (person/release/revision/visit-related/upcoming methods) * apidoc: List only method docstring's first paragraph in endpoint index * apidoc: Render type annotation for optional parameter * apidoc: Improve rendering issues * api: Fix problem in origin visit by type and url lookup -- Antoine R. Dumont (@ardumont) Wed, 01 Feb 2017 11:28:32 +0100 swh-web (0.0.69-1~swh1) unstable-swh; urgency=medium * v0.0.69 * Improve documentation information and rendering -- Antoine R. Dumont (@ardumont) Tue, 31 Jan 2017 14:31:19 +0100 swh-web (0.0.68-1~swh1) unstable-swh; urgency=medium * v0.0.68 * Improve ui with last nitpicks * Remove endpoints not supposed to be displayed -- Antoine R. Dumont (@ardumont) Wed, 25 Jan 2017 13:29:49 +0100 swh-web (0.0.67-1~swh1) unstable-swh; urgency=medium * v0.0.67 * Improve rendering style - pass 4 -- Antoine R. Dumont (@ardumont) Tue, 24 Jan 2017 15:30:58 +0100 swh-web (0.0.66-1~swh1) unstable-swh; urgency=medium * v0.0.66 * Improve rendering style - pass 4 -- Antoine R. Dumont (@ardumont) Tue, 24 Jan 2017 15:24:05 +0100 swh-web (0.0.65-1~swh1) unstable-swh; urgency=medium * v0.0.65 * Unify rendering style with www.s.o - pass 3 -- Antoine R. Dumont (@ardumont) Mon, 23 Jan 2017 19:58:19 +0100 swh-web (0.0.64-1~swh1) unstable-swh; urgency=medium * v0.0.64 * Unify rendering style with www.s.o - pass 2 -- Antoine R. Dumont (@ardumont) Mon, 23 Jan 2017 19:28:31 +0100 swh-web (0.0.63-1~swh1) unstable-swh; urgency=medium * v0.0.63 * Unify rendering style with www.s.o - pass 1 -- Antoine R. Dumont (@ardumont) Mon, 23 Jan 2017 16:06:30 +0100 swh-web (0.0.62-1~swh1) unstable-swh; urgency=medium * Release swh-web-ui v0.0.62 * Add flask-limiter to dependencies and wire it in -- Nicolas Dandrimont Fri, 20 Jan 2017 16:29:48 +0100 swh-web (0.0.61-1~swh1) unstable-swh; urgency=medium * v0.0.61 * Fix revision's metadata field limitation -- Antoine R. Dumont (@ardumont) Fri, 20 Jan 2017 15:26:37 +0100 swh-web (0.0.60-1~swh1) unstable-swh; urgency=medium * v0.0.60 * Improve escaping data -- Antoine R. Dumont (@ardumont) Fri, 20 Jan 2017 12:21:22 +0100 swh-web (0.0.59-1~swh1) unstable-swh; urgency=medium * v0.0.59 * Unify pagination on /revision/log/ and /revision/origin/log/ endpoints -- Antoine R. Dumont (@ardumont) Thu, 19 Jan 2017 15:59:06 +0100 swh-web (0.0.58-1~swh1) unstable-swh; urgency=medium * v0.0.58 * Pagination on /api/1/origin/visits/ endpoint -- Antoine R. Dumont (@ardumont) Thu, 19 Jan 2017 14:48:57 +0100 swh-web (0.0.57-1~swh1) unstable-swh; urgency=medium * v0.0.57 * Improve documentation information on api endpoints -- Antoine R. Dumont (@ardumont) Thu, 19 Jan 2017 13:32:56 +0100 swh-web (0.0.56-1~swh1) unstable-swh; urgency=medium * v0.0.56 * Add abilities to display multiple examples on each doc endpoint. -- Antoine R. Dumont (@ardumont) Wed, 18 Jan 2017 14:43:58 +0100 swh-web (0.0.55-1~swh1) unstable-swh; urgency=medium * v0.0.55 * api /content/search/ to /content/known/ * Adapt return values to empty list/dict instead of null * Remove empty values when mono-values are null * Fix broken entity endpoint * Update upcoming endpoints * apidoc: Remove hard-coded example and provide links to follow -- Antoine R. Dumont (@ardumont) Wed, 18 Jan 2017 11:27:45 +0100 swh-web (0.0.54-1~swh1) unstable-swh; urgency=medium * v0.0.54 * Improve documentation description and browsability * Fix css style -- Antoine R. Dumont (@ardumont) Mon, 16 Jan 2017 17:18:21 +0100 swh-web (0.0.53-1~swh1) unstable-swh; urgency=medium * v0.0.53 * apidoc: Update upcoming and hidden endpoints information * apidoc: Enrich route information with tags * apidoc: /api/1/revision/origin/log/: Add pagination explanation * apidoc: /api/1/revision/log/: Add pagination explanation * api: Fix filtering fields to work in depth -- Antoine R. Dumont (@ardumont) Fri, 13 Jan 2017 17:33:01 +0100 swh-web (0.0.52-1~swh1) unstable-swh; urgency=medium * v0.0.52 * Fix doc generation regarding arg and exception * Fix broken examples * Add missing documentation on not found origin visit -- Antoine R. Dumont (@ardumont) Thu, 12 Jan 2017 17:38:59 +0100 swh-web (0.0.51-1~swh1) unstable-swh; urgency=medium * v0.0.51 * Update configuration file from ini to yml -- Antoine R. Dumont (@ardumont) Fri, 16 Dec 2016 13:27:08 +0100 swh-web (0.0.50-1~swh1) unstable-swh; urgency=medium * v0.0.50 * Fix issue regarding data structure change in ctags' reading api endpoint -- Antoine R. Dumont (@ardumont) Tue, 06 Dec 2016 16:08:01 +0100 swh-web (0.0.49-1~swh1) unstable-swh; urgency=medium * v0.0.49 * Rendering improvments -- Antoine R. Dumont (@ardumont) Thu, 01 Dec 2016 16:29:31 +0100 swh-web (0.0.48-1~swh1) unstable-swh; urgency=medium * v0.0.48 * Fix api doc example to actual existing data * Improve search symbol view experience -- Antoine R. Dumont (@ardumont) Thu, 01 Dec 2016 15:32:44 +0100 swh-web (0.0.47-1~swh1) unstable-swh; urgency=medium * v0.0.47 * Improve search content ui (add datatable) * Improve search symbol ui (add datatable without pagination, with * multi-field search) * Split those views to improve readability -- Antoine R. Dumont (@ardumont) Thu, 01 Dec 2016 11:57:16 +0100 swh-web (0.0.46-1~swh1) unstable-swh; urgency=medium * v0.0.46 * Improve search output view on symbols -- Antoine R. Dumont (@ardumont) Wed, 30 Nov 2016 17:45:40 +0100 swh-web (0.0.45-1~swh1) unstable-swh; urgency=medium * v0.0.45 * Migrate search symbol api endpoint to strict equality search * Improve search symbol view result (based on that api) to navigate * through result * Permit to slice result per page with per page flag (limited to 100) * Unify behavior in renderer regarding pagination computation -- Antoine R. Dumont (@ardumont) Wed, 30 Nov 2016 11:00:49 +0100 swh-web (0.0.44-1~swh1) unstable-swh; urgency=medium * v0.0.44 * Rename appropriately /api/1/symbol to /api/1/content/symbol/ * Improve documentation on /api/1/content/symbol/ api endpoint -- Antoine R. Dumont (@ardumont) Tue, 29 Nov 2016 15:00:14 +0100 swh-web (0.0.43-1~swh1) unstable-swh; urgency=medium * v0.0.43 * Improve edge case when looking for ctags symbols * Add a lookup ui to search through symbols -- Antoine R. Dumont (@ardumont) Mon, 28 Nov 2016 16:42:33 +0100 swh-web (0.0.42-1~swh1) unstable-swh; urgency=medium * v0.0.42 * List ctags line as link to content in /browse/content/ view -- Antoine R. Dumont (@ardumont) Fri, 25 Nov 2016 16:21:12 +0100 swh-web (0.0.41-1~swh1) unstable-swh; urgency=medium * v0.0.41 * Improve browse content view by: * adding new information (license, mimetype, language) * highlighting source code -- Antoine R. Dumont (@ardumont) Fri, 25 Nov 2016 14:52:34 +0100 swh-web (0.0.40-1~swh1) unstable-swh; urgency=medium * v0.0.40 * Add pagination to symbol search endpoint -- Antoine R. Dumont (@ardumont) Thu, 24 Nov 2016 14:23:45 +0100 swh-web (0.0.39-1~swh1) unstable-swh; urgency=medium * v0.0.39 * Open /api/1/symbol// * Fix api breaking on /api/1/content/search/ -- Antoine R. Dumont (@ardumont) Thu, 24 Nov 2016 10:28:42 +0100 swh-web (0.0.38-1~swh1) unstable-swh; urgency=medium * v0.0.38 * Minor refactoring * Remove one commit which breaks production -- Antoine R. Dumont (@ardumont) Tue, 22 Nov 2016 16:26:03 +0100 swh-web (0.0.37-1~swh1) unstable-swh; urgency=medium * v0.0.37 * api: Open new endpoints on license, language, filetype * api: Update content endpoint to add url on new endpoints -- Antoine R. Dumont (@ardumont) Tue, 22 Nov 2016 15:04:07 +0100 swh-web (0.0.36-1~swh1) unstable-swh; urgency=medium * v0.0.36 * Adapt to latest origin_visit format -- Antoine R. Dumont (@ardumont) Thu, 08 Sep 2016 15:24:33 +0200 swh-web (0.0.35-1~swh1) unstable-swh; urgency=medium * v0.0.35 * Open /api/1/provenance// api endpoint * Open /api/1/origin//visits/() api endpoint * View: Fix redirection url issue -- Antoine R. Dumont (@ardumont) Mon, 05 Sep 2016 14:28:33 +0200 swh-web (0.0.34-1~swh1) unstable-swh; urgency=medium * v0.0.34 * Improve global ui navigation * Fix apidoc rendering issue * Open /api/1/provenance/ about content provenant information -- Antoine R. Dumont (@ardumont) Fri, 02 Sep 2016 11:42:04 +0200 swh-web (0.0.33-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.33 * New declarative API documentation mechanisms -- Nicolas Dandrimont Wed, 24 Aug 2016 16:25:24 +0200 swh-web (0.0.32-1~swh1) unstable-swh; urgency=medium * v0.0.32 * Activate tests during debian packaging * Fix issues on debian packaging * Fix useless jquery loading url * Improve date time parsing -- Antoine R. Dumont (@ardumont) Wed, 20 Jul 2016 12:35:09 +0200 swh-web (0.0.31-1~swh1) unstable-swh; urgency=medium * v0.0.31 * Unify jquery-flot library names with .min -- Antoine R. Dumont (@ardumont) Mon, 18 Jul 2016 11:11:59 +0200 swh-web (0.0.30-1~swh1) unstable-swh; urgency=medium * v0.0.30 * View: Open calendar ui view on origin * API: open /api/1/stat/visits// -- Antoine R. Dumont (@ardumont) Wed, 13 Jul 2016 18:42:40 +0200 swh-web (0.0.29-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.29 * All around enhancements of the web ui * Package now tested when building -- Nicolas Dandrimont Tue, 14 Jun 2016 17:58:42 +0200 swh-web (0.0.28-1~swh1) unstable-swh; urgency=medium * v0.0.28 * Fix packaging issues -- Antoine R. Dumont (@ardumont) Mon, 09 May 2016 16:21:04 +0200 swh-web (0.0.27-1~swh1) unstable-swh; urgency=medium * v0.0.27 * Fix packaging issue -- Antoine R. Dumont (@ardumont) Tue, 03 May 2016 16:52:40 +0200 swh-web (0.0.24-1~swh1) unstable-swh; urgency=medium * Release swh.web.ui v0.0.24 * New swh.storage API for timestamps -- Nicolas Dandrimont Fri, 05 Feb 2016 12:07:33 +0100 swh-web (0.0.23-1~swh1) unstable-swh; urgency=medium * v0.0.23 * Bump dependency requirements to latest swh.storage * Returns person's identifier on api + Hide person's emails in views endpoint * Try to decode the content's raw data and fail gracefully * Unify /directory api to Display content's raw data when path resolves to a file * Expose unconditionally the link to download the content's raw data * Download link data redirects to the api ones -- Antoine R. Dumont (@ardumont) Fri, 29 Jan 2016 17:50:31 +0100 swh-web (0.0.22-1~swh1) unstable-swh; urgency=medium * v0.0.22 * Open /browse/revision/origin/[/branch/][/ts/] /history// view * Open /browse/revision/origin/[/branch/][/ts/] / view * Open /browse/revision//history//directory/[] view * Open /browse/revision/origin/[/branch/][/ts/] /history//directory/[] view * Open /browse/revision/origin/[/branch/][/ts/] /directory/[] view * Open /browse/revision//directory// view * Open /browse/revision//history// view * Open /browse/revision//log/ view * Open /browse/entity// view * Release can point to other objects than revision * Fix misbehavior when retrieving git log * Fix another edge case when listing a directory that does not exist * Fix edge case when listing is empty * Fix person_get call * Update documentation about possible error codes -- Antoine R. Dumont (@ardumont) Tue, 26 Jan 2016 15:14:35 +0100 swh-web (0.0.21-1~swh1) unstable-swh; urgency=medium * v0.0.21 * Deal nicely with communication downtime with storage * Update to latest swh.storage api -- Antoine R. Dumont (@ardumont) Wed, 20 Jan 2016 16:31:34 +0100 swh-web (0.0.20-1~swh1) unstable-swh; urgency=medium * v0.0.20 * Open /api/1/entity// -- Antoine R. Dumont (@ardumont) Fri, 15 Jan 2016 16:40:56 +0100 swh-web (0.0.19-1~swh1) unstable-swh; urgency=medium * v0.0.19 * Improve directory_get_by_path integration with storage * Refactor - Only lookup sha1_git_root if needed + factorize service behavior -- Antoine R. Dumont (@ardumont) Fri, 15 Jan 2016 12:47:39 +0100 swh-web (0.0.18-1~swh1) unstable-swh; urgency=medium * v0.0.18 * Open /api/1/revision/origin/[/branch/][/ts/]/ history//directory/[] * origin/master Open /api/1/revision/origin/[/branch/][/ts/]/ history// * Open /api/1/revision/origin/[/branch/][/ts/]/ directory/[] * Open /api/1/revision/origin//branch//ts// * /directory/ apis can now point to files too. * Bump dependency requirement on latest swh.storage * Deactivate api querying occurrences for now * Improve function documentation -- Antoine R. Dumont (@ardumont) Wed, 13 Jan 2016 12:54:54 +0100 swh-web (0.0.17-1~swh1) unstable-swh; urgency=medium * v0.0.17 * Open /api/1/revision//directory/' * Open /api/1/revision//history//directory/ / * Enrich directory listing with url to next subdir * Improve testing coverage * Open 'limit' get query parameter to revision_log and revision_history api -- Antoine R. Dumont (@ardumont) Fri, 08 Jan 2016 11:36:55 +0100 swh-web (0.0.16-1~swh1) unstable-swh; urgency=medium * v0.0.16 * service.lookup_revision_log: Add a limit to the number of commits * Fix docstring rendering -- Antoine R. Dumont (@ardumont) Wed, 06 Jan 2016 15:37:21 +0100 swh-web (0.0.15-1~swh1) unstable-swh; urgency=medium * v0.0.15 * Improve browsable api rendering style * Fix typo in jquery.min.js link * Fix docstring typos * packaging: * add python3-flask-api as package dependency -- Antoine R. Dumont (@ardumont) Wed, 06 Jan 2016 15:12:04 +0100 swh-web (0.0.14-1~swh1) unstable-swh; urgency=medium * v0.0.14 * Open /revision//history// * Add links to api * Improve browsable api rendering -> when api links exists, actual html links will be displayed * Fix production bugs (regarding browsable api) -- Antoine R. Dumont (@ardumont) Wed, 06 Jan 2016 11:42:18 +0100 swh-web (0.0.13-1~swh1) unstable-swh; urgency=medium * v0.0.13 * Open /browse/person/ view * Open /browse/origin/ view * Open /browse/release/ view * Open /browse/revision/ view * Deactivate temporarily /browse/content/ * Add default sha1 * Automatic doc endpoint on base path -- Antoine R. Dumont (@ardumont) Tue, 15 Dec 2015 17:01:27 +0100 swh-web (0.0.12-1~swh1) unstable-swh; urgency=medium * v0.0.12 * Update /api/1/release/ with latest internal standard * Update /api/1/revision/ with latest internal standard * Add global filtering on 'fields' parameter * Update /api/1/content/ with links to raw resource * Improve documentations * Open /api/1/revision//log/ * Open /browse/directory/ to list directory content * Open /browse/content// to show the content * Open /browse/content//raw to show the content * Open /api/1/person/ * Implementation detail * Add Flask API dependency * Split controller in api and views module * Unify internal apis' behavior -- Antoine R. Dumont (@ardumont) Mon, 07 Dec 2015 16:44:43 +0100 swh-web (0.0.11-1~swh1) unstable-swh; urgency=medium * v0.0.11 * Open /1/api/content// * Open /api/1/revision/ * Open /api/1/release/ * Open /api/1/uploadnsearch/ (POST) * Open /api/1/origin/ * Unify 404 and 400 responses on api * Increase code coverage -- Antoine R. Dumont (@ardumont) Thu, 19 Nov 2015 11:24:46 +0100 swh-web (0.0.10-1~swh1) unstable-swh; urgency=medium * v0.0.10 * set document.domain to parent domain softwareheritage.org * improve HTML templates to be (more) valid * cosmetic change in Content-Type JSON header -- Stefano Zacchiroli Mon, 02 Nov 2015 13:59:45 +0100 swh-web (0.0.9-1~swh1) unstable-swh; urgency=medium * v0.0.9 * Remove query entry in api response * Deal with bad request properly with api calls * Improve coverage * Improve dev starting up app * Fix duplicated print statement in dev app startup -- Antoine R. Dumont (@ardumont) Fri, 30 Oct 2015 17:24:15 +0100 swh-web (0.0.8-1~swh1) unstable-swh; urgency=medium * version 0.0.8 -- Stefano Zacchiroli Wed, 28 Oct 2015 20:59:40 +0100 swh-web (0.0.7-1~swh1) unstable-swh; urgency=medium * v0.0.7 * Add @jsonp abilities to /api/1/stat/counters endpoint -- Antoine R. Dumont (@ardumont) Mon, 19 Oct 2015 14:01:40 +0200 swh-web (0.0.4-1~swh1) unstable-swh; urgency=medium * Prepare swh.web.ui v0.0.4 deployment -- Nicolas Dandrimont Fri, 16 Oct 2015 15:38:44 +0200 swh-web (0.0.3-1~swh1) unstable-swh; urgency=medium * Prepare deployment of swh-web-ui v0.0.3 -- Nicolas Dandrimont Wed, 14 Oct 2015 11:09:33 +0200 swh-web (0.0.2-1~swh1) unstable-swh; urgency=medium * Prepare swh.web.ui v0.0.2 deployment -- Nicolas Dandrimont Tue, 13 Oct 2015 16:25:46 +0200 swh-web (0.0.1-1~swh1) unstable-swh; urgency=medium * Initial release * v0.0.1 * Hash lookup to check existence in swh's backend * Hash lookup to detail a content -- Antoine R. Dumont (@ardumont) Thu, 01 Oct 2015 10:01:29 +0200 diff --git a/docs/developers-info.rst b/docs/developers-info.rst index 51f75de8..72f25993 100644 --- a/docs/developers-info.rst +++ b/docs/developers-info.rst @@ -1,135 +1,131 @@ Developers Information ====================== Sample configuration -------------------- -The configuration will be taken from the default configuration file: *~/.config/swh/web/web.yml*. +The configuration will be taken from the default configuration file: ``~/.config/swh/web/web.yml``. The following introduces a default configuration file: .. sourcecode:: yaml storage: cls: remote args: url: http://localhost:5002 debug: false throttling: cache_uri: None scopes: swh_api: limiter_rate: default: 120/h exempted_networks: - 127.0.0.0/8 Run server ---------- Either use the django manage script directly (useful in development mode as it offers various commands): .. sourcecode:: shell $ python3 -m swh.web.manage runserver or use the following shortcut: .. sourcecode:: shell $ make run Modules description ------------------- Common to all web applications ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Configuration and settings """""""""""""""""""""""""" - * :mod:`swh.web.config`: holds the SWH configuration for the web applications. + * :mod:`swh.web.config`: holds the configuration for the web applications. * :mod:`swh.web.doc_config`: utility module used to extend the sphinx configuration when building the documentation. * :mod:`swh.web.manage`: Django management module for developers. * :mod:`swh.web.urls`: module that holds the whole URI scheme of all the web applications. * :mod:`swh.web.wsgi`: WSGI module to use when deploying the web applications in production. * :mod:`swh.web.settings.common`: Common Django settings * :mod:`swh.web.settings.development`: Django settings for development * :mod:`swh.web.settings.production`: Django settings for production * :mod:`swh.web.settings.tests`: Django settings for tests Common utilities """""""""""""""" - * :mod:`swh.web.common.converters`: conversion module used to transform SWH raw data + * :mod:`swh.web.common.converters`: conversion module used to transform raw data to serializable ones. It is used by :mod:`swh.web.common.service`: to convert data before transmitting then to Django views. * :mod:`swh.web.common.exc`: module defining exceptions used in the web applications. * :mod:`swh.web.common.highlightjs`: utility module to ease the use of the highlightjs_ library in produced Django views. * :mod:`swh.web.common.query`: Utilities to parse data from HTTP endpoints. It is used by :mod:`swh.web.common.service`. * :mod:`swh.web.common.service`: Orchestration layer used by views module in charge of communication with :mod:`swh.storage` to retrieve information and perform conversion for the upper layer. * :mod:`swh.web.common.swh_templatetags`: Custom Django template tags library for swh. * :mod:`swh.web.common.throttling`: Custom request rate limiter to use with the `Django REST Framework `_ * :mod:`swh.web.common.urlsindex`: Utilities to help the registering of endpoints for the web applications * :mod:`swh.web.common.utils`: Utility functions used in the web applications implementation -SWH Web API application +swh-web API application ^^^^^^^^^^^^^^^^^^^^^^^ * :mod:`swh.web.api.apidoc`: Utilities to document the web api for its html browsable rendering. * :mod:`swh.web.api.apiresponse`: Utility module to ease the generation of web api responses. - * :mod:`swh.web.api.apiurls`: Utilities to facilitate the registration of SWH - web api endpoints. + * :mod:`swh.web.api.apiurls`: Utilities to facilitate the registration of web api endpoints. * :mod:`swh.web.api.urls`: Module that defines the whole URI scheme for the api endpoints - * :mod:`swh.web.api.utils`: Utility functions used in the SWH web api implementation. + * :mod:`swh.web.api.utils`: Utility functions used in the web api implementation. * :mod:`swh.web.api.views.content`: Implementation of API endpoints for getting information - about SWH contents. + about contents. * :mod:`swh.web.api.views.directory`: Implementation of API endpoints for getting information - about SWH directories. + about directories. * :mod:`swh.web.api.views.entity`: Implementation of API endpoints for getting information - about SWH entities. + about entities. * :mod:`swh.web.api.views.origin`: Implementation of API endpoints for getting information - about SWH origins. + about origins. * :mod:`swh.web.api.views.person`: Implementation of API endpoints for getting information - about SWH persons. + about persons. * :mod:`swh.web.api.views.release`: Implementation of API endpoints for getting information - about SWH releases. + about releases. * :mod:`swh.web.api.views.revision`: Implementation of API endpoints for getting information - about SWH revisions. + about revisions. * :mod:`swh.web.api.views.snapshot`: Implementation of API endpoints for getting information - about SWH snapshots. + about snapshots. * :mod:`swh.web.api.views.stat`: Implementation of API endpoints for getting information - about SWH archive statistics. + about archive statistics. * :mod:`swh.web.api.views.utils`: Utilities used in the web api endpoints implementation. -SWH Web browse application +swh-web browse application ^^^^^^^^^^^^^^^^^^^^^^^^^^ - * :mod:`swh.web.browse.browseurls`: Utilities to facilitate the registration of SWH web - browse endpoints. - * :mod:`swh.web.browse.urls`: Module that defines the whole URI scheme for the SWH web - browse endpoints. - * :mod:`swh.web.browse.utils`: Utilities functions used troughout the SWH web browse - endpoints implementation. - * :mod:`swh.web.browse.views.content`: Implementation of endpoints for browsing SWH contents. - * :mod:`swh.web.browse.views.directory`: Implementation of endpoints for browsing SWH directories. - * :mod:`swh.web.browse.views.identifiers`: Implementation of endpoints for browsing SWH objects + * :mod:`swh.web.browse.browseurls`: Utilities to facilitate the registration of browse endpoints. + * :mod:`swh.web.browse.urls`: Module that defines the whole URI scheme for the browse endpoints. + * :mod:`swh.web.browse.utils`: Utilities functions used throughout the browse endpoints implementation. + * :mod:`swh.web.browse.views.content`: Implementation of endpoints for browsing contents. + * :mod:`swh.web.browse.views.directory`: Implementation of endpoints for browsing directories. + * :mod:`swh.web.browse.views.identifiers`: Implementation of endpoints for browsing objects through persistent identifiers. - * :mod:`swh.web.browse.views.origin`: Implementation of endpoints for browsing SWH origins. - * :mod:`swh.web.browse.views.person`: Implementation of endpoints for browsing SWH persons. - * :mod:`swh.web.browse.views.release`: Implementation of endpoints for browsing SWH releases. - * :mod:`swh.web.browse.views.revision`: Implementation of endpoints for browsing SWH revisions. - * :mod:`swh.web.browse.views.snapshot`: Implementation of endpoints for browsing SWH snapshots. + * :mod:`swh.web.browse.views.origin`: Implementation of endpoints for browsing origins. + * :mod:`swh.web.browse.views.person`: Implementation of endpoints for browsing persons. + * :mod:`swh.web.browse.views.release`: Implementation of endpoints for browsing releases. + * :mod:`swh.web.browse.views.revision`: Implementation of endpoints for browsing revisions. + * :mod:`swh.web.browse.views.snapshot`: Implementation of endpoints for browsing snapshots. .. _highlightjs: https://highlightjs.org/ diff --git a/docs/uri-scheme-api.rst b/docs/uri-scheme-api.rst index b059c15e..d451f879 100644 --- a/docs/uri-scheme-api.rst +++ b/docs/uri-scheme-api.rst @@ -1,24 +1,24 @@ .. _swh-web-api-urls: -SWH Web API URLs +swh-web API URLs ================ .. include:: uri-scheme-api-content.rst .. include:: uri-scheme-api-directory.rst .. include:: uri-scheme-api-identifiers.rst .. include:: uri-scheme-api-origin.rst .. include:: uri-scheme-api-person.rst .. include:: uri-scheme-api-release.rst .. include:: uri-scheme-api-revision.rst .. include:: uri-scheme-api-snapshot.rst .. include:: uri-scheme-api-stat.rst .. include:: uri-scheme-api-vault.rst diff --git a/docs/uri-scheme-browse-content.rst b/docs/uri-scheme-browse-content.rst index d977fac1..73e42a06 100644 --- a/docs/uri-scheme-browse-content.rst +++ b/docs/uri-scheme-browse-content.rst @@ -1,92 +1,92 @@ Content ^^^^^^^ .. http:get:: /browse/content/[(algo_hash):](hash)/ - HTML view that displays a SWH content identified by its hash value. + HTML view that displays a content identified by its hash value. If the content to display is textual, it will be highlighted client-side if possible using highlightjs_. In order for that operation to be performed, a programming language must first be associated to the content. The following procedure is used in order to find the language: 1) First try to find a language from the content filename (provided as query parameter when navigating from a directory view). 2) If no language has been found from the filename, try to find one from the content mime type. The mime type is retrieved from the content metadata stored - in the SWH archive or is computed server-side using Python + in the archive or is computed server-side using Python magic module. It is also possible to highlight specific lines of a textual content (not in terms of syntax highlighting but to emphasize some relevant content part) by either: * clicking on line numbers (holding shift to highlight a lines range) * using an url fragment in the form '#Ln' or '#Lm-Ln' When that view is called in the context of a navigation coming from a directory view, a breadcrumb will be displayed on top of the rendered content in order to easily navigate up to the associated root directory. In that case, the path query parameter will be used and filled with the path of the file relative to the root directory. :param string algo_hash: optional parameter to indicate the algorithm used - to compute the content checksum (can be either *sha1*, - *sha1_git*, *sha256* or *blake2s256*, default to *sha1*) + to compute the content checksum (can be either ``sha1``, + ``sha1_git``, ``sha256`` or ``blake2s256``, default to ``sha1``) :param string hash: hexadecimal representation for the checksum from which - to retrieve the associated content in the SWH archive + to retrieve the associated content in the archive :query string path: describe the path of the content relative to a root directory (used to add context aware navigation links when navigating from a directory view) :statuscode 200: no error :statuscode 400: an invalid query string has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 404: requested content can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`content/sha1_git:f5d0b39a0cdddb91a31a537052b7d8d31a4aa79f/` :swh_web_browse:`content/sha1_git:f5d0b39a0cdddb91a31a537052b7d8d31a4aa79f/#L23-L41` :swh_web_browse:`content/blake2s256:1cc1e3124957c9be8a454c58e92eb925cf4aa9823984bd01451c5b7e0fee99d1/` :swh_web_browse:`content/sha1:1cb1447c1c7ddc1b03eac88398e40bd914d46b62/` :swh_web_browse:`content/sha256:8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903/` .. http:get:: /browse/content/[(algo_hash):](hash)/raw/ - HTML view that produces a raw display of a SWH content identified by its hash value. + HTML view that produces a raw display of a content identified by its hash value. The behaviour of that view depends on the mime type of the requested content. If the mime type is from the text family, the view will return a response whose content type is 'text/plain' that will be rendered by the browser. Otherwise, the view will return a response whose content type is 'application/octet-stream' and the browser will then offer to download the file. In the context of a navigation coming from a directory view, the filename query parameter will be used in order to provide the real name of the file when one wants to save it locally. :param string algo_hash: optional parameter to indicate the algorithm used - to compute the content checksum (can be either *sha1*, - *sha1_git*, *sha256* or *blake2s256*, default to *sha1*) + to compute the content checksum (can be either ``sha1``, + ``sha1_git``, ``sha256`` or ``blake2s256``, default to ``sha1``) :param string hash: hexadecimal representation for the checksum from which - to retrieve the associated content in the SWH archive + to retrieve the associated content in the archive :query string filename: indicate the name of the file holding the requested content (used when one wants to save the content to a local file) :statuscode 200: no error :statuscode 400: an invalid query string has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 404: requested content can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`content/sha1_git:f5d0b39a0cdddb91a31a537052b7d8d31a4aa79f/raw/?filename=LICENSE` :swh_web_browse:`content/blake2s256:1cc1e3124957c9be8a454c58e92eb925cf4aa9823984bd01451c5b7e0fee99d1/raw/?filename=MAINTAINERS` :swh_web_browse:`content/sha1:1cb1447c1c7ddc1b03eac88398e40bd914d46b62/raw/` :swh_web_browse:`content/sha256:8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903/raw/?filename=COPYING` .. _highlightjs: https://highlightjs.org/ \ No newline at end of file diff --git a/docs/uri-scheme-browse-directory.rst b/docs/uri-scheme-browse-directory.rst index 4c8b9e5c..f8d63b53 100644 --- a/docs/uri-scheme-browse-directory.rst +++ b/docs/uri-scheme-browse-directory.rst @@ -1,31 +1,31 @@ Directory ^^^^^^^^^ .. http:get:: /browse/directory/(sha1_git)/[(path)/] - HTML view for browsing the content of a SWH directory reachable from - the provided root one (including itself) identified by its *sha1_git* value. + HTML view for browsing the content of a directory reachable from + the provided root one (including itself) identified by its **sha1_git** value. The content of the directory is first sorted in lexicographical order and the sub-directories are displayed before the regular files. The view enables to navigate from the requested directory to directories reachable from it in a recursive way but also up to the root directory. A breadcrumb located in the top part of the view allows to keep track of the paths navigated so far. - :param string sha1_git: hexadecimal representation for the *sha1_git* identifier + :param string sha1_git: hexadecimal representation for the **sha1_git** identifier of the directory to browse :param string path: optional parameter used to specify the path of a directory reachable from the provided root one :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested directory can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested directory can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`directory/977fc4b98c0e85816348cebd3b12026407c368b6/` :swh_web_browse:`directory/9650ed370c0330d2cd2b6fd1e9febf649ffe538d/kernel/sched/` diff --git a/docs/uri-scheme-browse-origin.rst b/docs/uri-scheme-browse-origin.rst index 6001405b..67b0dcef 100644 --- a/docs/uri-scheme-browse-origin.rst +++ b/docs/uri-scheme-browse-origin.rst @@ -1,489 +1,500 @@ Origin ^^^^^^ This describes the URI scheme when one wants to browse the Software Heritage archive in the context of an origin (for instance, a repository crawled from GitHub or a Debian source package). All the views pointed by that scheme offer quick links to browse objects as found during the associated crawls performed by Software Heritage: * the root directory of the origin * the list of branches of the origin * the list of releases of the origin Origin visits """"""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visits/ - HTML view that displays a visits reporting for a SWH origin identified by + HTML view that displays a visits reporting for a software origin identified by its type and url. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, ``svn``, + ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/visits/` :swh_web_browse:`origin/git/url/https://github.com/python/cpython/visits/` :swh_web_browse:`origin/deb://Debian-Security/packages/mediawiki/visits/` :swh_web_browse:`origin/https://gitorious.org/qt/qtbase.git/visits/` Origin directory """""""""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/directory/[(path)/] HTML view for browsing the content of a directory reachable from the root directory - (including itself) associated to the latest full visit of a SWH origin. + (including itself) associated to the latest full visit of a software origin. The content of the directory is first sorted in lexicographical order and the sub-directories are displayed before the regular files. The view enables to navigate from the requested directory to directories reachable from it in a recursive way but also up to the origin root directory. A breadcrumb located in the top part of the view allows to keep track of the paths navigated so far. The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the directory content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string path: optional parameter used to specify the path of a directory reachable from the origin root one :query string branch: specify the origin branch name from which to retrieve the root directory :query string release: specify the origin release name from which to retrieve the root directory :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the root directory - :query int visit_id: specify a SWH visit id to retrieve the directory from instead + representation of its **sha1_git** value, from which to retrieve the root directory + :query int visit_id: specify a visit id to retrieve the directory from instead of using the latest full visit by default :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive or the provided path does not exist from the origin root directory **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/directory/` :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/directory/net/ethernet/` :swh_web_browse:`origin/https://github.com/python/cpython/directory/` :swh_web_browse:`origin/https://github.com/python/cpython/directory/Python/` :swh_web_browse:`origin/https://github.com/python/cpython/directory/?branch=refs/heads/2.7` .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/directory/[(path)/] HTML view for browsing the content of a directory reachable from - the root directory (including itself) associated to a visit of a SWH + the root directory (including itself) associated to a visit of a software origin closest to a provided timestamp. The content of the directory is first sorted in lexicographical order and the sub-directories are displayed before the regular files. The view enables to navigate from the requested directory to directories reachable from it in a recursive way but also up to the origin root directory. A breadcrumb located in the top part of the view allows to keep track of the paths navigated so far. The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the directory content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string timestamp: a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. + or Unix timestamp to parse in order to find the closest visit. :param path: optional parameter used to specify the path of a directory reachable from the origin root one :type path: string :query string branch: specify the origin branch name from which to retrieve the root directory :query string release: specify the origin release name from which to retrieve the root directory :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the directory - :query int visit_id: specify a SWH visit id to retrieve the directory from instead + representation of its **sha1_git** value, from which to retrieve the directory + :query int visit_id: specify a visit id to retrieve the directory from instead of using the provided timestamp :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive, + :statuscode 404: requested origin can not be found in the archive, requested visit timestamp does not exist or the provided path does not exist from the origin root directory **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/visit/1493926809/directory/` :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/visit/2016-09-14T10:36:21/directory/net/ethernet/` :swh_web_browse:`origin/git/url/https://github.com/python/cpython/visit/1474620651/directory/` :swh_web_browse:`origin/git/url/https://github.com/python/cpython/visit/2017-05-05/directory/Python/` :swh_web_browse:`origin/git/url/https://github.com/python/cpython/visit/2015-08/directory/?branch=refs/heads/2.7` Origin content """""""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/content/(path)/ - HTML view that produces a display of a SWH content - associated to the latest full visit of a SWH origin. + HTML view that produces a display of a content + associated to the latest full visit of a software origin. If the content to display is textual, it will be highlighted client-side if possible using highlightjs_. The procedure to perform that task is described in :http:get:`/browse/content/[(algo_hash):](hash)/`. It is also possible to highlight specific lines of a textual content (not in terms of syntax highlighting but to emphasize some relevant content part) by either: * clicking on line numbers (holding shift to highlight a lines range) * using an url fragment in the form '#Ln' or '#Lm-Ln' The view displays a breadcrumb on top of the rendered content in order to easily navigate up to the origin root directory. The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string path: path of a content reachable from the origin root directory :query string branch: specify the origin branch name from which to retrieve the content :query string release: specify the origin release name from which to retrieve the content :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the content - :query int visit_id: specify a SWH visit id to retrieve the content from instead + representation of its **sha1_git** value, from which to retrieve the content + :query int visit_id: specify a visit id to retrieve the content from instead of using the latest full visit by default :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive, + :statuscode 404: requested origin can not be found in the archive, or the provided content path does not exist from the origin root directory **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/git/git/content/git.c/` :swh_web_browse:`origin/git/url/https://github.com/git/git/content/git.c/` :swh_web_browse:`origin/https://github.com/mozilla/gecko-dev/content/js/src/json.cpp/` :swh_web_browse:`origin/https://github.com/git/git/content/git.c/?branch=refs/heads/next` .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/content/(path)/ - HTML view that produces a display of a SWH content associated to a - visit of a SWH origin closest to a provided timestamp. + HTML view that produces a display of a content associated to a + visit of a software origin closest to a provided timestamp. If the content to display is textual, it will be highlighted client-side if possible using highlightjs_. The procedure to perform that task is described in :http:get:`/browse/content/[(algo_hash):](hash)/`. It is also possible to highlight specific lines of a textual content (not in terms of syntax highlighting but to emphasize some relevant content part) by either: * clicking on line numbers (holding shift to highlight a lines range) * using an url fragment in the form '#Ln' or '#Lm-Ln' The view displays a breadcrumb on top of the rendered content in order to easily navigate up to the origin root directory. The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string timestamp: a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. + or Unix timestamp to parse in order to find the closest visit. :param string path: path of a content reachable from the origin root directory :query string branch: specify the origin branch name from which to retrieve the content :query string release: specify the origin release name from which to retrieve the content :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the content - :query int visit_id: specify a SWH visit id to retrieve the content from instead + representation of its **sha1_git** value, from which to retrieve the content + :query int visit_id: specify a visit id to retrieve the content from instead of using the provided timestamp :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive, + :statuscode 404: requested origin can not be found in the archive, requested visit timestamp does not exist or the provided content path does not exist from the origin root directory **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/git/git/visit/1473933564/content/git.c/` :swh_web_browse:`origin/git/url/https://github.com/git/git/visit/2016-05-05T00:0:00+00:00/content/git.c/` :swh_web_browse:`origin/https://github.com/mozilla/gecko-dev/visit/1490126182/content/js/src/json.cpp/` :swh_web_browse:`origin/https://github.com/mozilla/gecko-dev/visit/2017-03-21/content/js/src/json.cpp/#L904-L931` :swh_web_browse:`origin/https://github.com/git/git/visit/2017-09-15/content/git.c/?branch=refs/heads/next` Origin history """""""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/log/ HTML view that produces a display of revisions history heading - to the last revision found during the latest visit of a SWH origin. + to the last revision found during the latest visit of a software origin. In other words, it shows the commit log associated to the latest - full visit of a SWH origin. + full visit of a software origin. The following data are displayed for each log entry: * link to browse the associated revision in the origin context * author of the revision * date of the revision * message associated the revision * commit date of the revision By default, the revisions are ordered in reverse chronological order of their commit date. N log entries are displayed per page (default is 100). In order to navigate in a large history, two buttons are present at the bottom of the view: - * *Newer*: fetch and display if available the N more recent log entries + * **Newer**: fetch and display if available the N more recent log entries than the ones currently displayed - * *Older*: fetch and display if available the N older log entries + * **Older**: fetch and display if available the N older log entries than the ones currently displayed The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :query int per_page: the number of log entries to display per page :query int offset: the number of revisions to skip before returning those to display - :query str revs_ordering: specify the revisions ordering, possible values are *committer_date*, - *dfs*, *dfs_post* and *bfs* + :query str revs_ordering: specify the revisions ordering, possible values are ``committer_date``, + ``dfs``, ``dfs_post`` and ``bfs`` :query string branch: specify the origin branch name from which to retrieve the commit log :query string release: specify the origin release name from which to retrieve the commit log :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the commit log - :query int visit_id: specify a SWH visit id to retrieve the history log from instead + representation of its **sha1_git** value, from which to retrieve the commit log + :query int visit_id: specify a visit id to retrieve the history log from instead of using the latest visit by default :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/videolan/vlc/log/` :swh_web_browse:`origin/https://github.com/Kitware/CMake/log/` :swh_web_browse:`origin/https://github.com/Kitware/CMake/log/?branch=refs/heads/release` .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/log/ HTML view that produces a display of revisions history heading - to the last revision found during a visit of a SWH origin closest + to the last revision found during a visit of a software origin closest to the provided timestamp. In other words, it shows the commit log associated to a visit of - a SWH origin closest to a provided timestamp. + a software origin closest to a provided timestamp. The following data are displayed for each log entry: * author of the revision * link to the revision metadata * message associated the revision * date of the revision * link to browse the associated source tree in the origin context N log entries are displayed per page (default is 20). In order to navigate in a large history, two buttons are present at the bottom of the view: - * *Newer*: fetch and display if available the N more recent log entries + * **Newer**: fetch and display if available the N more recent log entries than the ones currently displayed - * *Older*: fetch and display if available the N older log entries + * **Older**: fetch and display if available the N older log entries than the ones currently displayed The view also enables to easily switch between the origin branches and releases through a dropdown menu. The origin branch (default to master) from which to retrieve the content can also be specified by using the branch query parameter. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string timestamp: a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. + or Unix timestamp to parse in order to find the closest visit. :query string revs_breadcrumb: used internally to store the navigation breadcrumbs (i.e. the list of descendant revisions visited so far). It must be a string in the form "(rev_1)[/(rev_2)/.../(rev_n)]" where rev_i corresponds to a - revision *sha1_git*. + revision **sha1_git**. :query int per_page: the number of log entries to display per page (default is 20, max is 50) :query string branch: specify the origin branch name from which to retrieve the commit log :query string release: specify the origin release name from which to retrieve the commit log :query string revision: specify the origin revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the commit log - :query int visit_id: specify a SWH visit id to retrieve the history log from instead + representation of its **sha1_git** value, from which to retrieve the commit log + :query int visit_id: specify a visit id to retrieve the history log from instead of using the provided timestamp :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/videolan/vlc/visit/1459651262/log/` :swh_web_browse:`origin/git/url/https://github.com/Kitware/CMake/visit/2016-04-01/log/` :swh_web_browse:`origin/https://github.com/Kitware/CMake/visit/1438116814/log/?branch=refs/heads/release` :swh_web_browse:`origin/https://github.com/Kitware/CMake/visit/2017-05-05T03:14:23/log/?branch=refs/heads/release` Origin branches """"""""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/branches/ HTML view that produces a display of the list of branches - found during the latest full visit of a SWH origin. + found during the latest full visit of a software origin. The following data are displayed for each branch: * its name * a link to browse the associated directory * a link to browse the associated revision * last commit message * last commit date That list of branches is paginated, each page displaying a maximum of 100 branches. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/deb/url/deb://Debian/packages/linux/branches/` :swh_web_browse:`origin/https://github.com/webpack/webpack/branches/` .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/branches/ HTML view that produces a display of the list of branches - found during a visit of a SWH origin closest to the provided timestamp. + found during a visit of a software origin closest to the provided timestamp. The following data are displayed for each branch: * its name * a link to browse the associated directory * a link to browse the associated revision * last commit message * last commit date That list of branches is paginated, each page displaying a maximum of 100 branches. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string timestamp: a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. + or Unix timestamp to parse in order to find the closest visit. :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/kripken/emscripten/visit/2017-05-05T12:02:03/branches/` :swh_web_browse:`origin/deb://Debian/packages/apache2-mod-xforward/visit/2017-11-15T05:15:09/branches/` Origin releases """"""""""""""" .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/releases/ HTML view that produces a display of the list of releases - found during the latest full visit of a SWH origin. + found during the latest full visit of a software origin. The following data are displayed for each release: * its name * a link to browse the release details * its target type (revision, directory, content or release) * its associated message * its date That list of releases is paginated, each page displaying a maximum of 100 releases. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/git/git/releases/` :swh_web_browse:`origin/https://github.com/webpack/webpack/releases/` .. http:get:: /browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/releases/ HTML view that produces a display of the list of releases - found during a visit of a SWH origin closest to the provided timestamp. + found during a visit of a software origin closest to the provided timestamp. The following data are displayed for each release: * its name * a link to browse the release details * its target type (revision, directory, content or release) * its associated message * its date That list of releases is paginated, each page displaying a maximum of 100 releases. - :param string origin_type: the type of the SWH origin (*git*, *svn*, *deb* ...) + :param string origin_type: the type of software origin (possible values are ``git``, + ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the url of the origin (e.g. https://github.com/(user)/(repo)/) :param string timestamp: a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. + or Unix timestamp to parse in order to find the closest visit. :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`origin/git/url/https://github.com/torvalds/linux/visit/2017-11-21T19:37:42/releases/` :swh_web_browse:`origin/https://github.com/Kitware/CMake/visit/2016-09-23T14:06:35/releases/` .. _highlightjs: https://highlightjs.org/ .. _dateutil.parser.parse: http://dateutil.readthedocs.io/en/stable/parser.html diff --git a/docs/uri-scheme-browse-person.rst b/docs/uri-scheme-browse-person.rst index a64a25e6..950ad2cc 100644 --- a/docs/uri-scheme-browse-person.rst +++ b/docs/uri-scheme-browse-person.rst @@ -1,10 +1,10 @@ Person ^^^^^^ .. http:get:: /browse/person/(person_id)/ - HTML view that displays information regarding a SWH person. + HTML view that displays information regarding a person. - :param int person_id: the id of a SWH person + :param int person_id: the id of a person :statuscode 200: no error - :statuscode 404: requested person can not be found in the SWH archive + :statuscode 404: requested person can not be found in the archive diff --git a/docs/uri-scheme-browse-release.rst b/docs/uri-scheme-browse-release.rst index ba895ff9..862e0953 100644 --- a/docs/uri-scheme-browse-release.rst +++ b/docs/uri-scheme-browse-release.rst @@ -1,25 +1,25 @@ Release ^^^^^^^ .. http:get:: /browse/release/(sha1_git)/ - HTML view that displays metadata associated to a SWH release: + HTML view that displays metadata associated to a release: * the author * the release date * the release name * the associated message * the type of target the release points to (revision, directory, content or release) * the link to browse the release target - :param string sha1_git: hexadecimal representation for the *sha1_git* - identifier of a SWH release + :param string sha1_git: hexadecimal representation for the **sha1_git** + identifier of a release :statuscode 200: no error - :statuscode 404: requested release can not be found in the SWH archive + :statuscode 404: requested release can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`release/208f61cc7a5dbc9879ae6e5c2f95891e270f09ef/` :swh_web_browse:`release/f883596e997fe5bcbc5e89bee01b869721326109/` diff --git a/docs/uri-scheme-browse-revision.rst b/docs/uri-scheme-browse-revision.rst index 88c3215e..e9e55ea6 100644 --- a/docs/uri-scheme-browse-revision.rst +++ b/docs/uri-scheme-browse-revision.rst @@ -1,81 +1,82 @@ Revision ^^^^^^^^ .. http:get:: /browse/revision/(sha1_git)/ - HTML view to browse a SWH revision. It notably shows the revision date + HTML view to browse a revision. It notably shows the revision date and message but also offers links to get more details on: * its author * its parent revisions * the history log reachable from it The view also enables to navigate in the source tree associated to the revision and browse its content. Last but not least, the view displays the list of file changes introduced in the revision but also the diffs of each changed files. - :param string sha1_git: hexadecimal representation for the *sha1_git* - identifier of a SWH revision - :query string origin_type: used internally to associate a SWH origin type - (*git*, *svn*, *deb* ...) to the revision + :param string sha1_git: hexadecimal representation for the **sha1_git** + identifier of a revision + :query string origin_type: used internally to associate a software origin type + (possible values are ``git``, ``svn``, ``hg``, ``deb``, ``pypi``, ``ftp`` + or ``deposit``) to the revision :query string origin_url: used internally to associate an origin url (e.g. https://github.com/user/repo) to the revision :query string timestamp: used internally to associate an origin visit to the revision, must be a date string (any format parsable by `dateutil.parser.parse`_) - or Unix timestamp to parse in order to find the closest SWH visit. - :query int visit_id: used internally to specify a SWH visit id instead of + or Unix timestamp to parse in order to find the closest visit. + :query int visit_id: used internally to specify a visit id instead of using the provided timestamp :query string path: used internally when navigating in the source tree associated to the revision :statuscode 200: no error - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 404: requested revision can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`revision/f1b94134a4b879bc55c3dacdb496690c8ebdc03f/` :swh_web_browse:`revision/d1aa2b3f607b35dc5dbf613b2334b6d243ec2bda/` .. _dateutil.parser.parse: http://dateutil.readthedocs.io/en/stable/parser.html .. http:get:: /browse/revision/(sha1_git)/log/ HTML view that displays the list of revisions heading to a given one. In other words, it shows a commit log. The following data are displayed for each log entry: * link to browse the revision * author of the revision * date of the revision * message associated to the revision * commit date of the revision By default, the revisions are ordered in reverse chronological order of their commit date. N log entries are displayed per page (default is 100). In order to navigate in a large history, two buttons are present at the bottom of the view: - * *Newer*: fetch and display if available the N more recent log entries + * **Newer**: fetch and display if available the N more recent log entries than the ones currently displayed - * *Older*: fetch and display if available the N older log entries + * **Older**: fetch and display if available the N older log entries than the ones currently displayed - :param string sha1_git: hexadecimal representation for the *sha1_git* - identifier of a SWH revision + :param string sha1_git: hexadecimal representation for the **sha1_git** + identifier of a revision :query int per_page: the number of log entries to display per page :query int offset: the number of revisions to skip before returning those to display - :query str revs_ordering: specify the revisions ordering, possible values are *committer_date*, - *dfs*, *dfs_post* and *bfs* + :query str revs_ordering: specify the revisions ordering, possible values are ``committer_date``, + ``dfs``, ``dfs_post`` and ``bfs`` :statuscode 200: no error - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 404: requested revision can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`revision/f1b94134a4b879bc55c3dacdb496690c8ebdc03f/log/` :swh_web_browse:`revision/d1aa2b3f607b35dc5dbf613b2334b6d243ec2bda/log/` diff --git a/docs/uri-scheme-browse-snapshot.rst b/docs/uri-scheme-browse-snapshot.rst index 01263015..8f5f2fd7 100644 --- a/docs/uri-scheme-browse-snapshot.rst +++ b/docs/uri-scheme-browse-snapshot.rst @@ -1,187 +1,187 @@ Snapshot ^^^^^^^^ .. http:get:: /browse/snapshot/(snapshot_id)/ - HTML view that displays the content of a SWH snapshot from its identifier + HTML view that displays the content of a snapshot from its identifier (see :func:`swh.model.identifiers.snapshot_identifier` in our data model module for details about how they are computed). A snapshot is a set of named branches, which are pointers to objects at any level of the Software Heritage DAG. It represents a full picture of an origin at a given time. Thus, multiple visits of different origins can point to the same snapshot (for instance, when several projects are forks of a common one). Currently, that endpoint simply performs a redirection to :http:get:`/browse/snapshot/(snapshot_id)/directory/[(path)/]` in order to display the root directory associated to the default snapshot branch (usually master). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/baebc2109e4a2ec22a1129a3859647e191d04df4/` :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/` Snapshot directory """""""""""""""""" .. http:get:: /browse/snapshot/(snapshot_id)/directory/[(path)/] HTML view that displays the content of a directory reachable from - a SWH snapshot. + a snapshot. The features offered by the view are similar to the one for browsing a directory in an origin context (see :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/directory/[(path)/]`). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :param string path: optional parameter used to specify the path of a directory reachable from the snapshot root one :query string branch: specify the snapshot branch name from which to retrieve the root directory :query string release: specify the snapshot release name from which to retrieve the root directory :query string revision: specify the snapshot revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the root directory + representation of its **sha1_git** value, from which to retrieve the root directory :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/baebc2109e4a2ec22a1129a3859647e191d04df4/directory/drivers/gpu/` :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/directory/src/opengl/` :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/log/?release=v5.7.0` Snapshot content """""""""""""""" .. http:get:: /browse/snapshot/(snapshot_id)/content/(path)/ - HTML view that produces a display of a SWH content reachable from - a SWH snapshot. + HTML view that produces a display of a content reachable from + a snapshot. The features offered by the view are similar to the one for browsing a content in an origin context (see :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/content/(path)/`). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :param string path: path of a content reachable from the snapshot root directory :query string branch: specify the snapshot branch name from which to retrieve the content :query string release: specify the snapshot release name from which to retrieve the content :query string revision: specify the snapshot revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the content + representation of its **sha1_git** value, from which to retrieve the content :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive, + :statuscode 404: requested snapshot can not be found in the archive, or the provided content path does not exist from the origin root directory **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/baebc2109e4a2ec22a1129a3859647e191d04df4/content/init/initramfs.c` :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/content/src/opengl/qglbuffer.h/` :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/content/src/opengl/qglbuffer.h/?release=v5.0.0` Snapshot history """""""""""""""" .. http:get:: /browse/snapshot/(snapshot_id)/log/ HTML view that produces a display of revisions history (aka the commit log) - heading to the last revision collected in a SWH snasphot. + heading to the last revision collected in a snapshot. The features offered by the view are similar to the one for browsing the history in an origin context (see :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/log/`). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :query string revs_breadcrumb: used internally to store the navigation breadcrumbs (i.e. the list of descendant revisions visited so far). It must be a string in the form "(rev_1)[/(rev_2)/.../(rev_n)]" where rev_i corresponds to a - revision *sha1_git*. + revision **sha1_git**. :query int per_page: the number of log entries to display per page (default is 20, max is 50) :query string branch: specify the snapshot branch name from which to retrieve the commit log - :query string release: specify the snasphot release name from which + :query string release: specify the snapshot release name from which to retrieve the commit log :query string revision: specify the snapshot revision, identified by the hexadecimal - representation of its *sha1_git* value, from which to retrieve the commit log + representation of its **sha1_git** value, from which to retrieve the commit log :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/a274b44111f777209556e94920b7e71cf5c305cd/log/` :swh_web_browse:`snapshot/9ca9e75279df5f4e3fee19bf5190ed672dcdfb33/log/?branch=refs/heads/emacs-unicode` Snapshot branches """"""""""""""""" .. http:get:: /browse/snapshot/(snapshot_id)/branches/ HTML view that produces a display of the list of branches - collected in a SWH snapshot. + collected in a snapshot. The features offered by the view are similar to the one for browsing the list of branches in an origin context (see :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/branches/`). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/03d7897352541e78ee7b13a580dc836778e8126a/branches/` :swh_web_browse:`snapshot/f37563b953327f8fd83e39af6ebb929ef85103d5/branches/` Snapshot releases """"""""""""""""" .. http:get:: /browse/snapshot/(snapshot_id)/releases/ HTML view that produces a display of the list of releases - collected in a SWH snapshot. + collected in a snapshot. The features offered by the view are similar to the one for browsing the list of releases in an origin context (see :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/releases/`). - :param string snapshot_id: hexadecimal representation of the snapshot *sha1* identifier + :param string snapshot_id: hexadecimal representation of the snapshot **sha1** identifier :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Examples:** .. parsed-literal:: :swh_web_browse:`snapshot/673156c31a876c5b99b2fe3e89615529de9a3c44/releases/` :swh_web_browse:`snapshot/23e6fb084a60cc909b9e222d80d89fdb98756dee/releases/` diff --git a/docs/uri-scheme-browse.rst b/docs/uri-scheme-browse.rst index b18c6b56..c04cc241 100644 --- a/docs/uri-scheme-browse.rst +++ b/docs/uri-scheme-browse.rst @@ -1,99 +1,99 @@ -URI scheme for SWH Web Browse application +URI scheme for swh-web Browse application ========================================= -This web application aims to provide HTML views to easily navigate in the SWH archive, +This web application aims to provide HTML views to easily navigate in the archive, thus it needs to be reached from a web browser. -If you intend to query the SWH archive programmatically through any HTTP client, +If you intend to query the archive programmatically through any HTTP client, please refer to the :ref:`swh-web-api-urls` section instead. Context-independent browsing ---------------------------- -Context-independent URLs provide information about SWH objects (e.g., +Context-independent URLs provide information about objects (e.g., revisions, directories, contents, person, ...), independently of the contexts where they have been found (e.g., specific repositories, branches, commits, ...). The following endpoints are the same of the API case (see below), and just render the corresponding information for user consumption. Where hyperlinks are created, they always point to other context-independent user URLs: - * :http:get:`/browse/content/[(algo_hash):](hash)/`: Display a SWH content - * :http:get:`/browse/content/[(algo_hash):](hash)/raw/`: Get / Download SWH content raw data - * :http:get:`/browse/directory/(sha1_git)/[(path)/]`: Browse the content of a SWH directory - * :http:get:`/browse/person/(person_id)/`: Information on a SWH person - * :http:get:`/browse/revision/(sha1_git)/`: Browse a SWH revision - * :http:get:`/browse/revision/(sha1_git)/log/`: Browse history log heading to a SWH revision + * :http:get:`/browse/content/[(algo_hash):](hash)/`: Display a content + * :http:get:`/browse/content/[(algo_hash):](hash)/raw/`: Get / Download content raw data + * :http:get:`/browse/directory/(sha1_git)/[(path)/]`: Browse the content of a directory + * :http:get:`/browse/person/(person_id)/`: Information on a person + * :http:get:`/browse/revision/(sha1_git)/`: Browse a revision + * :http:get:`/browse/revision/(sha1_git)/log/`: Browse history log heading to a revision Context-dependent browsing -------------------------- -Context-dependent URLs provide information about SWH objects, limited to +Context-dependent URLs provide information about objects, limited to specific contexts where the objects have been found. -For instance, instead of having to specify a (root) revision by *sha1_git*, users might want to -specify a place and a time. In SWH a "place" is an origin, with an optional +For instance, instead of having to specify a (root) revision by **sha1_git**, users might want to +specify a place and a time. In Software Heritage a "place" is an origin, with an optional branch name; a "time" is a timestamp at which some place has been observed by -SWH crawlers. +Software Heritage crawlers. Wherever a revision context is expected in a path (i.e., a **/browse/revision/(sha1_git)/** path fragment) we can put in its stead a path fragment of the form **/origin/(origin_type)/url/(origin_url)/[/visit/(timestamp)/][?branch=(branch)]**. -Such a fragment is resolved, internally by the SWH archive, to a revision *sha1_git* as follows: +Such a fragment is resolved, internally by the archive, to a revision **sha1_git** as follows: -- if *timestamp* is absent: look for the most recent crawl of origin - identified by *origin_type* and *origin_url* -- if *timestamp* is given: look for the closest crawl of origin identified - by *origin_type* and *origin_url* from timestamp *timestamp* -- if *branch* is given as a query parameter: look for the branch *branch* -- if *branch* is absent: look for branch "HEAD" or "master" -- return the revision *sha1_git* pointed by the chosen branch +- if **timestamp** is absent: look for the most recent crawl of origin + identified by **origin_type** and **origin_url** +- if **timestamp** is given: look for the closest crawl of origin identified + by **origin_type** and **origin_url** from timestamp **timestamp** +- if **branch** is given as a query parameter: look for the branch **branch** +- if **branch** is absent: look for branch "HEAD" or "master" +- return the revision **sha1_git** pointed by the chosen branch The already mentioned URLs for revision contexts can therefore be alternatively specified by users as: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/directory/[(path)/]` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/directory/[(path)/]` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/content/(path)/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/content/(path)/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/log/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/log/` Typing: -- *origin_type* corresponds to the type of the archived origin: - *git*, *svn*, *hg*, *deposit*, *deb*, ... +- **origin_type** corresponds to the type of the archived origin: + ``git``, ``svn``,``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit`` -- *origin_url* corresponds to the URL the origin was crawled from, +- **origin_url** corresponds to the URL the origin was crawled from, for instance https://github.com/(user)/(repo)/ -- *branch* name is given as per the corresponding VCS (e.g., Git) as - a query parameter to the requestes URL. +- **branch** name is given as per the corresponding VCS (e.g., Git) as + a query parameter to the requested URL. -- *timestamp* is given in a format as liberal as possible, to uphold the +- **timestamp** is given in a format as liberal as possible, to uphold the principle of least surprise. At the very minimum it is possible to enter timestamps as: - Unix epoch timestamp (see for instance the output of `date +%s`) - ISO 8601 timestamps (see for instance the output of `date -I`, `date -Is`) - YYYY[MM[DD[HH[MM[SS]]]]] ad-hoc format - YYYY[-MM[-DD[ HH:[MM:[SS:]]]]] ad-hoc format -SWH Browse Urls ---------------- +swh-web Browse Urls +------------------- .. include:: uri-scheme-browse-content.rst .. include:: uri-scheme-browse-directory.rst .. include:: uri-scheme-browse-origin.rst .. include:: uri-scheme-browse-person.rst .. include:: uri-scheme-browse-release.rst .. include:: uri-scheme-browse-revision.rst .. include:: uri-scheme-browse-snapshot.rst diff --git a/docs/uri-scheme-identifiers.rst b/docs/uri-scheme-identifiers.rst index 871d5c4f..064e1569 100644 --- a/docs/uri-scheme-identifiers.rst +++ b/docs/uri-scheme-identifiers.rst @@ -1,30 +1,30 @@ -URI scheme for SWH identifiers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +URI scheme for Software Heritage identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A subset of Software Heritage objects (contents, directories, releases and revisions) can be browsed using :ref:`persistent-identifiers`. Those identifiers are guaranteed to remain stable (persistent) over time. .. http:get:: /(swh_id)/ - End point to browse SWH objects using their persistent identifiers. + End point to browse Software Heritage objects using their persistent identifiers. A redirection to the adequate HTML view will be performed when reaching it. - :param string swh_id: a persistent identifier for a SWH object + :param string swh_id: a persistent identifier for a Software Heritage object (see the :ref:`persistent-identifiers` section to learn more about its syntax) - :resheader Location: the redirection URL for browsing the SWH object + :resheader Location: the redirection URL for browsing the Software Heritage object associated to the provided identifier :statuscode 302: no error :statuscode 400: the provided identifier is malformed **Examples:** .. parsed-literal:: :swh_web:`swh:1:cnt:0ffd12d85cdec70c88e852fc3f5ea9fd342213cd` :swh_web:`swh:1:dir:db990da9af15427455ce7836ce2b8a34b9bf67f5` :swh_web:`swh:1:rel:a9b7e3f1eada90250a6b2ab2ef3e0a846cb16831` :swh_web:`swh:1:rev:f1b94134a4b879bc55c3dacdb496690c8ebdc03f` :swh_web:`swh:1:snp:673156c31a876c5b99b2fe3e89615529de9a3c44` diff --git a/swh.web.egg-info/PKG-INFO b/swh.web.egg-info/PKG-INFO index c8a25acb..7e118943 100644 --- a/swh.web.egg-info/PKG-INFO +++ b/swh.web.egg-info/PKG-INFO @@ -1,127 +1,127 @@ Metadata-Version: 2.1 Name: swh.web -Version: 0.0.167 +Version: 0.0.168 Summary: Software Heritage Web UI Home-page: https://forge.softwareheritage.org/diffusion/DWUI/ Author: Software Heritage developers Author-email: swh-devel@inria.fr License: UNKNOWN Project-URL: Bug Reports, https://forge.softwareheritage.org/maniphest Project-URL: Funding, https://www.softwareheritage.org/donate Project-URL: Source, https://forge.softwareheritage.org/source/swh-web Description: # swh-web This repository holds the development of Software Heritage web applications: - * SWH Web API (https://archive.softwareheritage.org/api): enables to query the content of the SWH archive through HTTP requests and get responses in JSON or YAML. + * swh-web API (https://archive.softwareheritage.org/api): enables to query the content of the archive through HTTP requests and get responses in JSON or YAML. - * SWH Web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the SWH archive. + * swh-web browse (https://archive.softwareheritage.org/browse): graphical interface that eases the navigation in the archive. Documentation about how to use these components but also the details of their URI schemes can be found in the docs folder. The produced HTML documentation can be read and browsed at https://docs.softwareheritage.org/devel/swh-web/index.html. ## Technical details Those applications are powered by: * [Django Web Framework](https://www.djangoproject.com/) on the backend side with the following extensions enabled: * [django-rest-framework](http://www.django-rest-framework.org/) * [django-webpack-loader](https://github.com/owais/django-webpack-loader) * [django-js-reverse](http://django-js-reverse.readthedocs.io/en/latest/) * [webpack](https://webpack.js.org/) on the frontend side for better static assets management, including: * assets dependencies management and retrieval through [npm](https://www.npmjs.com/) * linting of custom javascript code (through [eslint](https://eslint.org/)) and stylesheets (through [stylelint](https://stylelint.io/)) * use of [es6](http://es6-features.org) syntax and advanced javascript feature like [async/await](https://javascript.info/async-await) or [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) thanks to [babel](https://babeljs.io/) (es6 to es5 transpiler and polyfills provider) * assets minification (using [UglifyJS](https://github.com/mishoo/UglifyJS2) and [cssnano](http://cssnano.co/)) but also dead code elimination for production use ## How to build and run ### Requirements First you will need [Python 3](https://www.python.org) and a complete [swh development environment](https://forge.softwareheritage.org/source/swh-environment/) installed. To run the backend, you need to have the following Python 3 modules installed: * beautifulsoup4 * django >= 1.10.7 * djangorestframework >= 3.4.0 * django_webpack_loader * django_js_reverse * docutils * file_magic >= 0.3.0 * htmlmin * lxml * pygments * pypandoc * python-dateutil * pyyaml * requests To compile the frontend assets, you need to have [nodejs](https://nodejs.org/en/) >= 8.x (preferably version 8.x LTS) and [npm](https://www.npmjs.com/) (or [yarn](https://yarnpkg.com/en/)) installed. If you are on Debian stretch, you can easily install an up to date nodejs/npm from the stretch-backports repository or by following the instructions located at https://github.com/nodesource/distributions. Once you have installed nodejs, issue the following command in the root directory of swh-web in order to retrieve all the frontend dependencies: ``` $ npm install ``` or if you prefer to use yarn (faster than npm): ``` $ yarn install ``` Please note that the static assets bundles generated by webpack are not stored in the git repository. Follow the instructions below in order to generate them in order to be able to run the frontend part of the web applications. ### Make targets Below is the list of available make targets that can be executed from the root directory of swh-web in order to build and/or execute the web applications under various configurations: * **run-django-webpack-devserver**: Compile and serve not optimized (without mignification and dead code elimination) frontend static assets using [webpack-dev-server](https://github.com/webpack/webpack-dev-server) and run django server with development settings. This is the recommended target to use when developing swh-web as it enables automatic reloading of backend and frontend part of the applications when modifying source files (*.py, *.js, *.css, *.html). * **run-django-webpack-dev**: Compile not optimized (no minification, no dead code elimination) frontend static assets using webpack and run django server with development settings. This is the recommended target when one only wants to develop the backend side of the application. * **run-django-webpack-prod**: Compile optimized (with minification and dead code elimination) frontend static assets using webpack and run django server with production settings. This is useful to test the applications in production mode (with the difference that static assets are served by django). Production settings notably enable advanced django caching and you will need to have [memcached](https://memcached.org/) installed for that feature to work. * **run-django-server-dev**: Run the django server with development settings but without compiling frontend static assets through webpack. * **run-django-server-prod**: Run the django server with production settings but without compiling frontend static assets through webpack. * **run-gunicorn-server**: Run the web applications with production settings in a [gunicorn](http://gunicorn.org/) worker as they will be in real production environment. Once one of these targets executed, the web applications can be executed by pointing your browser to http://localhost:5004. ### Npm/Yarn targets Below is a list of available npm/yarn targets in order to only execute the frontend static assets compilation (no web server will be executed): * **build-dev**: compile not optimized (without mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. * **build**: compile optimized (with mignification and dead code elimination) frontend static assets and store the results in the `swh/web/static` folder. **The build target must be executed prior performing the Debian packaging of swh-web** in order for the package to contain the optimized assets dedicated to production environment. To execute these targets, issue the following commmand: ``` $ npm run ``` or if you prefer using yarn: ``` $ yarn ``` Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: OS Independent Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django Description-Content-Type: text/markdown Provides-Extra: testing diff --git a/swh.web.egg-info/SOURCES.txt b/swh.web.egg-info/SOURCES.txt index 85feb66f..e75bc61f 100644 --- a/swh.web.egg-info/SOURCES.txt +++ b/swh.web.egg-info/SOURCES.txt @@ -1,392 +1,392 @@ .gitignore AUTHORS CONTRIBUTORS LICENSE MANIFEST.in Makefile Makefile.local README.md package-lock.json package.json pytest.ini requirements-swh.txt requirements-test.txt requirements.txt setup.py tox.ini version.txt yarn.lock debian/changelog debian/compat debian/control debian/copyright debian/postinst debian/rules debian/source/format docs/.gitignore docs/Makefile docs/conf.py docs/developers-info.rst docs/index.rst docs/uri-scheme-api-content.rst docs/uri-scheme-api-directory.rst docs/uri-scheme-api-identifiers.rst docs/uri-scheme-api-origin.rst docs/uri-scheme-api-person.rst docs/uri-scheme-api-release.rst docs/uri-scheme-api-revision.rst docs/uri-scheme-api-snapshot.rst docs/uri-scheme-api-stat.rst docs/uri-scheme-api-vault.rst docs/uri-scheme-api.rst docs/uri-scheme-browse-content.rst docs/uri-scheme-browse-directory.rst docs/uri-scheme-browse-origin.rst docs/uri-scheme-browse-person.rst docs/uri-scheme-browse-release.rst docs/uri-scheme-browse-revision.rst docs/uri-scheme-browse-snapshot.rst docs/uri-scheme-browse.rst docs/uri-scheme-identifiers.rst docs/_static/.placeholder docs/_templates/.placeholder swh/__init__.py swh.web.egg-info/PKG-INFO swh.web.egg-info/SOURCES.txt swh.web.egg-info/dependency_links.txt swh.web.egg-info/requires.txt swh.web.egg-info/top_level.txt swh/web/__init__.py swh/web/config.py swh/web/doc_config.py swh/web/manage.py swh/web/urls.py swh/web/wsgi.py swh/web/admin/__init__.py swh/web/admin/adminurls.py swh/web/admin/deposit.py swh/web/admin/origin_save.py swh/web/admin/urls.py swh/web/api/__init__.py swh/web/api/apidoc.py swh/web/api/apiresponse.py swh/web/api/apiurls.py swh/web/api/renderers.py swh/web/api/urls.py swh/web/api/utils.py swh/web/api/views/__init__.py swh/web/api/views/content.py swh/web/api/views/directory.py swh/web/api/views/entity.py swh/web/api/views/identifiers.py swh/web/api/views/origin.py swh/web/api/views/origin_save.py swh/web/api/views/person.py swh/web/api/views/release.py swh/web/api/views/revision.py swh/web/api/views/snapshot.py swh/web/api/views/stat.py swh/web/api/views/utils.py swh/web/api/views/vault.py swh/web/assets/config/.bootstraprc swh/web/assets/config/.eslintrc swh/web/assets/config/bootstrap-pre-customize.scss swh/web/assets/config/webpack.config.development.js swh/web/assets/config/webpack.config.production.js swh/web/assets/config/webpack-plugins/remove-source-map-url-webpack-plugin.js swh/web/assets/src/bundles/admin/deposit.js swh/web/assets/src/bundles/admin/index.js swh/web/assets/src/bundles/admin/origin-save.js swh/web/assets/src/bundles/browse/breadcrumbs.css swh/web/assets/src/bundles/browse/browse-utils.js swh/web/assets/src/bundles/browse/browse.css swh/web/assets/src/bundles/browse/content.css swh/web/assets/src/bundles/browse/index.js swh/web/assets/src/bundles/browse/origin-save.js swh/web/assets/src/bundles/browse/origin-search.js swh/web/assets/src/bundles/browse/snapshot-navigation.css swh/web/assets/src/bundles/browse/snapshot-navigation.js swh/web/assets/src/bundles/browse/swh-ids-utils.js swh/web/assets/src/bundles/origin/index.js swh/web/assets/src/bundles/origin/visits-calendar.js swh/web/assets/src/bundles/origin/visits-histogram.js swh/web/assets/src/bundles/origin/visits-reporting.css swh/web/assets/src/bundles/origin/visits-reporting.js swh/web/assets/src/bundles/revision/diff-utils.js swh/web/assets/src/bundles/revision/index.js swh/web/assets/src/bundles/revision/log-utils.js swh/web/assets/src/bundles/revision/revision.css swh/web/assets/src/bundles/vault/index.js swh/web/assets/src/bundles/vault/vault-create-tasks.js swh/web/assets/src/bundles/vault/vault-ui.js swh/web/assets/src/bundles/vault/vault.css swh/web/assets/src/bundles/vendors/datatables.css swh/web/assets/src/bundles/vendors/index.js swh/web/assets/src/bundles/webapp/breadcrumbs.css swh/web/assets/src/bundles/webapp/code-highlighting.js swh/web/assets/src/bundles/webapp/index.js swh/web/assets/src/bundles/webapp/pdf-rendering.js swh/web/assets/src/bundles/webapp/readme-rendering.js swh/web/assets/src/bundles/webapp/webapp-utils.js swh/web/assets/src/bundles/webapp/webapp.css swh/web/assets/src/utils/functions.js swh/web/assets/src/utils/heaps-permute.js swh/web/assets/src/utils/highlightjs.css swh/web/assets/src/utils/highlightjs.js swh/web/assets/src/utils/jquery.tabSlideOut.css swh/web/assets/src/utils/jquery.tabSlideOut.js swh/web/assets/src/utils/showdown.css swh/web/assets/src/utils/showdown.js swh/web/browse/__init__.py swh/web/browse/browseurls.py swh/web/browse/identifiers.py swh/web/browse/urls.py swh/web/browse/utils.py swh/web/browse/views/__init__.py swh/web/browse/views/content.py swh/web/browse/views/directory.py swh/web/browse/views/origin.py swh/web/browse/views/origin_save.py swh/web/browse/views/person.py swh/web/browse/views/release.py swh/web/browse/views/revision.py swh/web/browse/views/snapshot.py swh/web/browse/views/utils/__init__.py swh/web/browse/views/utils/snapshot_context.py swh/web/common/__init__.py swh/web/common/apps.py swh/web/common/converters.py swh/web/common/exc.py swh/web/common/highlightjs.py swh/web/common/middlewares.py swh/web/common/models.py swh/web/common/origin_save.py swh/web/common/query.py swh/web/common/service.py swh/web/common/swh_templatetags.py swh/web/common/throttling.py swh/web/common/urlsindex.py swh/web/common/utils.py swh/web/common/migrations/0001_initial.py swh/web/common/migrations/0002_saveoriginrequest_visit_date.py swh/web/common/migrations/0003_saveoriginrequest_loading_task_status.py swh/web/common/migrations/__init__.py swh/web/misc/__init__.py swh/web/misc/coverage.py swh/web/settings/__init__.py swh/web/settings/common.py swh/web/settings/development.py swh/web/settings/production.py swh/web/settings/tests.py swh/web/static/robots.txt swh/web/static/webpack-stats.json swh/web/static/css/browse.ab5be83726de277b08c7.css swh/web/static/css/browse.ab5be83726de277b08c7.css.map swh/web/static/css/highlightjs.7b32fa88e820b087cafd.css swh/web/static/css/highlightjs.7b32fa88e820b087cafd.css.map -swh/web/static/css/origin.245751215322daa84934.css -swh/web/static/css/origin.245751215322daa84934.css.map +swh/web/static/css/origin.6b57666194b71082b679.css +swh/web/static/css/origin.6b57666194b71082b679.css.map swh/web/static/css/revision.84ec9135fe56255b5f3c.css swh/web/static/css/revision.84ec9135fe56255b5f3c.css.map swh/web/static/css/showdown.647625950777ab491cca.css swh/web/static/css/showdown.647625950777ab491cca.css.map swh/web/static/css/vault.d6b1227ec2867753aa78.css swh/web/static/css/vault.d6b1227ec2867753aa78.css.map swh/web/static/css/vendors.ebdb90e76da36ff5e611.css swh/web/static/css/vendors.ebdb90e76da36ff5e611.css.map swh/web/static/css/webapp.74f9a287fc2402da3850.css swh/web/static/css/webapp.74f9a287fc2402da3850.css.map swh/web/static/fonts/alegreya-latin-400.woff swh/web/static/fonts/alegreya-latin-400.woff2 swh/web/static/fonts/alegreya-latin-400italic.woff swh/web/static/fonts/alegreya-latin-400italic.woff2 swh/web/static/fonts/alegreya-latin-500.woff swh/web/static/fonts/alegreya-latin-500.woff2 swh/web/static/fonts/alegreya-latin-500italic.woff swh/web/static/fonts/alegreya-latin-500italic.woff2 swh/web/static/fonts/alegreya-latin-700.woff swh/web/static/fonts/alegreya-latin-700.woff2 swh/web/static/fonts/alegreya-latin-700italic.woff swh/web/static/fonts/alegreya-latin-700italic.woff2 swh/web/static/fonts/alegreya-latin-800.woff swh/web/static/fonts/alegreya-latin-800.woff2 swh/web/static/fonts/alegreya-latin-800italic.woff swh/web/static/fonts/alegreya-latin-800italic.woff2 swh/web/static/fonts/alegreya-latin-900.woff swh/web/static/fonts/alegreya-latin-900.woff2 swh/web/static/fonts/alegreya-latin-900italic.woff swh/web/static/fonts/alegreya-latin-900italic.woff2 swh/web/static/fonts/alegreya-sans-latin-100.woff swh/web/static/fonts/alegreya-sans-latin-100.woff2 swh/web/static/fonts/alegreya-sans-latin-100italic.woff swh/web/static/fonts/alegreya-sans-latin-100italic.woff2 swh/web/static/fonts/alegreya-sans-latin-300.woff swh/web/static/fonts/alegreya-sans-latin-300.woff2 swh/web/static/fonts/alegreya-sans-latin-300italic.woff swh/web/static/fonts/alegreya-sans-latin-300italic.woff2 swh/web/static/fonts/alegreya-sans-latin-400.woff swh/web/static/fonts/alegreya-sans-latin-400.woff2 swh/web/static/fonts/alegreya-sans-latin-400italic.woff swh/web/static/fonts/alegreya-sans-latin-400italic.woff2 swh/web/static/fonts/alegreya-sans-latin-500.woff swh/web/static/fonts/alegreya-sans-latin-500.woff2 swh/web/static/fonts/alegreya-sans-latin-500italic.woff swh/web/static/fonts/alegreya-sans-latin-500italic.woff2 swh/web/static/fonts/alegreya-sans-latin-700.woff swh/web/static/fonts/alegreya-sans-latin-700.woff2 swh/web/static/fonts/alegreya-sans-latin-700italic.woff swh/web/static/fonts/alegreya-sans-latin-700italic.woff2 swh/web/static/fonts/alegreya-sans-latin-800.woff swh/web/static/fonts/alegreya-sans-latin-800.woff2 swh/web/static/fonts/alegreya-sans-latin-800italic.woff swh/web/static/fonts/alegreya-sans-latin-800italic.woff2 swh/web/static/fonts/alegreya-sans-latin-900.woff swh/web/static/fonts/alegreya-sans-latin-900.woff2 swh/web/static/fonts/alegreya-sans-latin-900italic.woff swh/web/static/fonts/alegreya-sans-latin-900italic.woff2 swh/web/static/fonts/fontawesome-webfont.eot swh/web/static/fonts/fontawesome-webfont.svg swh/web/static/fonts/fontawesome-webfont.ttf swh/web/static/fonts/fontawesome-webfont.woff swh/web/static/fonts/fontawesome-webfont.woff2 swh/web/static/fonts/octicons.eot swh/web/static/fonts/octicons.svg swh/web/static/fonts/octicons.ttf swh/web/static/fonts/octicons.woff swh/web/static/fonts/octicons.woff2 swh/web/static/fonts/open-iconic.eot swh/web/static/fonts/open-iconic.otf swh/web/static/fonts/open-iconic.svg swh/web/static/fonts/open-iconic.ttf swh/web/static/fonts/open-iconic.woff swh/web/static/img/arrow-up-small.png swh/web/static/img/swh-api.png swh/web/static/img/swh-browse.png swh/web/static/img/swh-logo.png swh/web/static/img/swh-logo.svg swh/web/static/img/swh-spinner-small.gif swh/web/static/img/swh-spinner.gif swh/web/static/img/swh-vault.png swh/web/static/img/icons/swh-logo-32x32.png swh/web/static/img/icons/swh-logo-archive-180x180.png swh/web/static/img/icons/swh-logo-archive-192x192.png swh/web/static/img/icons/swh-logo-archive-270x270.png swh/web/static/img/logos/debian.png swh/web/static/img/logos/github.png swh/web/static/img/logos/gitlab.svg swh/web/static/img/logos/gitorious.png swh/web/static/img/logos/gnu.png swh/web/static/img/logos/googlecode.png swh/web/static/img/logos/hal.png swh/web/static/img/logos/inria.jpg swh/web/static/img/logos/pypi.svg swh/web/static/js/admin.4ebdc9f536458c637197.js swh/web/static/js/admin.4ebdc9f536458c637197.js.map swh/web/static/js/browse.ab5be83726de277b08c7.js swh/web/static/js/browse.ab5be83726de277b08c7.js.map swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js.map -swh/web/static/js/origin.245751215322daa84934.js -swh/web/static/js/origin.245751215322daa84934.js.map +swh/web/static/js/origin.6b57666194b71082b679.js +swh/web/static/js/origin.6b57666194b71082b679.js.map swh/web/static/js/pdf.worker.min.js swh/web/static/js/pdfjs.a2182ae126e9711b9149.js swh/web/static/js/pdfjs.a2182ae126e9711b9149.js.map swh/web/static/js/revision.84ec9135fe56255b5f3c.js swh/web/static/js/revision.84ec9135fe56255b5f3c.js.map swh/web/static/js/showdown.647625950777ab491cca.js swh/web/static/js/showdown.647625950777ab491cca.js.map swh/web/static/js/vault.d6b1227ec2867753aa78.js swh/web/static/js/vault.d6b1227ec2867753aa78.js.map swh/web/static/js/vendors.ebdb90e76da36ff5e611.js swh/web/static/js/vendors.ebdb90e76da36ff5e611.js.map swh/web/static/js/webapp.74f9a287fc2402da3850.js swh/web/static/js/webapp.74f9a287fc2402da3850.js.map swh/web/templates/coverage.html swh/web/templates/error.html swh/web/templates/homepage.html swh/web/templates/layout.html swh/web/templates/login.html swh/web/templates/logout.html swh/web/templates/admin/deposit.html swh/web/templates/admin/origin-save.html swh/web/templates/api/api.html swh/web/templates/api/apidoc.html swh/web/templates/api/endpoints.html swh/web/templates/browse/branches.html swh/web/templates/browse/browse.html swh/web/templates/browse/content.html swh/web/templates/browse/directory.html swh/web/templates/browse/help.html swh/web/templates/browse/layout.html swh/web/templates/browse/origin-save.html swh/web/templates/browse/origin-visits.html swh/web/templates/browse/person.html swh/web/templates/browse/release.html swh/web/templates/browse/releases.html swh/web/templates/browse/revision-log.html swh/web/templates/browse/revision.html swh/web/templates/browse/search.html swh/web/templates/browse/vault-ui.html swh/web/templates/includes/apidoc-header.html swh/web/templates/includes/apidoc-header.md swh/web/templates/includes/breadcrumbs.html swh/web/templates/includes/content-display.html swh/web/templates/includes/directory-display.html swh/web/templates/includes/empty-snapshot.html swh/web/templates/includes/global-modals.html swh/web/templates/includes/http-error.html swh/web/templates/includes/readme-display.html swh/web/templates/includes/show-metadata.html swh/web/templates/includes/show-swh-ids.html swh/web/templates/includes/snapshot-context.html swh/web/templates/includes/top-navigation.html swh/web/templates/includes/vault-create-tasks.html swh/web/tests/__init__.py swh/web/tests/conftest.py swh/web/tests/testcase.py swh/web/tests/admin/__init__.py swh/web/tests/admin/test_origin_save.py swh/web/tests/api/__init__.py swh/web/tests/api/test_api_lookup.py swh/web/tests/api/test_apidoc.py swh/web/tests/api/test_apiresponse.py swh/web/tests/api/test_utils.py swh/web/tests/api/views/__init__.py swh/web/tests/api/views/test_content.py swh/web/tests/api/views/test_directory.py swh/web/tests/api/views/test_entity.py swh/web/tests/api/views/test_identifiers.py swh/web/tests/api/views/test_origin.py swh/web/tests/api/views/test_origin_save.py swh/web/tests/api/views/test_person.py swh/web/tests/api/views/test_release.py swh/web/tests/api/views/test_revision.py swh/web/tests/api/views/test_snapshot.py swh/web/tests/api/views/test_stat.py swh/web/tests/api/views/test_vault.py swh/web/tests/browse/__init__.py swh/web/tests/browse/test_utils.py swh/web/tests/browse/views/__init__.py swh/web/tests/browse/views/test_content.py swh/web/tests/browse/views/test_directory.py swh/web/tests/browse/views/test_identifiers.py swh/web/tests/browse/views/test_origin.py swh/web/tests/browse/views/test_person.py swh/web/tests/browse/views/test_release.py swh/web/tests/browse/views/test_revision.py swh/web/tests/browse/views/data/__init__.py swh/web/tests/browse/views/data/content_test_data.py swh/web/tests/browse/views/data/directory_test_data.py swh/web/tests/browse/views/data/iso-8859-1_encoded_content swh/web/tests/browse/views/data/origin_test_data.py swh/web/tests/browse/views/data/release_test_data.py swh/web/tests/browse/views/data/revision_test_data.py swh/web/tests/browse/views/data/swh-logo.png swh/web/tests/common/__init__.py swh/web/tests/common/test_converters.py swh/web/tests/common/test_highlightjs.py swh/web/tests/common/test_query.py swh/web/tests/common/test_service.py swh/web/tests/common/test_templatetags.py swh/web/tests/common/test_throttling.py swh/web/tests/common/test_utils.py \ No newline at end of file diff --git a/swh/web/admin/adminurls.py b/swh/web/admin/adminurls.py index e44f33aa..ba2b82c2 100644 --- a/swh/web/admin/adminurls.py +++ b/swh/web/admin/adminurls.py @@ -1,38 +1,38 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common.urlsindex import UrlsIndex class AdminUrls(UrlsIndex): """ - Class to manage SWH web admin urls. + Class to manage swh-web admin urls. """ scope = 'admin' class admin_route(object): # noqa: N801 """ - Decorator to ease the registration of a SWH web admin endpoint + Decorator to ease the registration of a swh-web admin endpoint Args: url_patterns: list of url patterns used by Django to identify the admin routes view_name: the name of the Django view associated to the routes used to reverse the url """ # noqa def __init__(self, *url_patterns, view_name=None): super().__init__() self.url_patterns = [] for url_pattern in url_patterns: self.url_patterns.append('^' + url_pattern + '$') self.view_name = view_name def __call__(self, f): # register the route and its view in the browse endpoints index for url_pattern in self.url_patterns: AdminUrls.add_url_pattern(url_pattern, f, self.view_name) return f diff --git a/swh/web/api/apidoc.py b/swh/web/api/apidoc.py index d0968891..f39cc42e 100644 --- a/swh/web/api/apidoc.py +++ b/swh/web/api/apidoc.py @@ -1,356 +1,358 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import docutils.nodes import docutils.parsers.rst import docutils.utils import functools import os import re from functools import wraps from rest_framework.decorators import api_view from swh.web.common.utils import parse_rst from swh.web.api.apiurls import APIUrls from swh.web.api.apiresponse import make_api_response, error_response class _HTTPDomainDocVisitor(docutils.nodes.NodeVisitor): """ docutils visitor for walking on a parsed rst document containing sphinx httpdomain roles. Its purpose is to extract relevant info regarding swh api endpoints (for instance url arguments) from their docstring written using sphinx httpdomain. """ # httpdomain roles we want to parse (based on sphinxcontrib.httpdomain 1.6) parameter_roles = ('param', 'parameter', 'arg', 'argument') response_json_object_roles = ('resjsonobj', 'resjson', '>jsonobj', '>json') response_json_array_roles = ('resjsonarr', '>jsonarr') query_parameter_roles = ('queryparameter', 'queryparam', 'qparam', 'query') request_header_roles = ('header', 'resheader', 'responseheader') status_code_roles = ('statuscode', 'status', 'code') def __init__(self, document, urls, data): super().__init__(document) self.urls = urls self.url_idx = 0 self.data = data self.args_set = set() self.params_set = set() self.returns_set = set() self.status_codes_set = set() self.reqheaders_set = set() self.resheaders_set = set() self.field_list_visited = False def process_paragraph(self, par): """ Process extracted paragraph text before display. Cleanup document model markups and transform the paragraph into a valid raw rst string (as the apidoc documentation transform rst to html when rendering). """ par = par.replace('\n', ' ') - # keep emphasized and strong text + # keep emphasized, strong and literal text par = par.replace('', '*') par = par.replace('', '*') par = par.replace('', '**') par = par.replace('', '**') + par = par.replace('', '``') + par = par.replace('', '``') # remove parsed document markups par = re.sub('<[^<]+?>', '', par) # api urls cleanup to generate valid links afterwards par = re.sub('\(\w+\)', '', par) # noqa par = re.sub('\[.*\]', '', par) # noqa par = par.replace('//', '/') # transform references to api endpoints into valid rst links par = re.sub(':http:get:`(.*)`', r'`<\1>`_', par) # transform references to some elements into bold text par = re.sub(':http:header:`(.*)`', r'**\1**', par) par = re.sub(':func:`(.*)`', r'**\1**', par) return par def visit_field_list(self, node): """ Visit parsed rst field lists to extract relevant info regarding api endpoint. """ self.field_list_visited = True for child in node.traverse(): # get the parsed field name if isinstance(child, docutils.nodes.field_name): field_name = child.astext() # parse field text elif isinstance(child, docutils.nodes.paragraph): text = self.process_paragraph(str(child)) field_data = field_name.split(' ') # Parameters if field_data[0] in self.parameter_roles: if field_data[2] not in self.args_set: self.data['args'].append({'name': field_data[2], 'type': field_data[1], 'doc': text}) self.args_set.add(field_data[2]) # Query Parameters if field_data[0] in self.query_parameter_roles: if field_data[2] not in self.params_set: self.data['params'].append({'name': field_data[2], 'type': field_data[1], 'doc': text}) self.params_set.add(field_data[2]) # Response type if field_data[0] in self.response_json_array_roles or \ field_data[0] in self.response_json_object_roles: # array if field_data[0] in self.response_json_array_roles: self.data['return_type'] = 'array' # object else: self.data['return_type'] = 'object' # returned object field if field_data[2] not in self.returns_set: self.data['returns'].append({'name': field_data[2], 'type': field_data[1], 'doc': text}) self.returns_set.add(field_data[2]) # Status Codes if field_data[0] in self.status_code_roles: if field_data[1] not in self.status_codes_set: self.data['status_codes'].append({'code': field_data[1], # noqa 'doc': text}) self.status_codes_set.add(field_data[1]) # Request Headers if field_data[0] in self.request_header_roles: if field_data[1] not in self.reqheaders_set: self.data['reqheaders'].append({'name': field_data[1], 'doc': text}) self.reqheaders_set.add(field_data[1]) # Response Headers if field_data[0] in self.response_header_roles: if field_data[1] not in self.resheaders_set: resheader = {'name': field_data[1], 'doc': text} self.data['resheaders'].append(resheader) self.resheaders_set.add(field_data[1]) if resheader['name'] == 'Content-Type' and \ resheader['doc'] == 'application/octet-stream': self.data['return_type'] = 'octet stream' def visit_paragraph(self, node): """ Visit relevant paragraphs to parse """ # only parsed top level paragraphs if isinstance(node.parent, docutils.nodes.block_quote): text = self.process_paragraph(str(node)) # endpoint description if not text.startswith('**') and self.data['description'] != text: self.data['description'] += '\n\n' if self.data['description'] else '' # noqa self.data['description'] += text # http methods elif text.startswith('**Allowed HTTP Methods:**'): text = text.replace('**Allowed HTTP Methods:**', '') http_methods = text.strip().split(',') http_methods = [m[m.find('`')+1:-1].upper() for m in http_methods] self.data['urls'].append({'rule': self.urls[self.url_idx], 'methods': http_methods}) self.url_idx += 1 def visit_literal_block(self, node): """ Visit literal blocks """ text = node.astext() # literal block in endpoint description if not self.field_list_visited: self.data['description'] += ':\n\n\t%s' % text # extract example url if ':swh_web_api:' in text: self.data['examples'].append( '/api/1/' + re.sub('.*`(.*)`.*', r'\1', text)) def visit_bullet_list(self, node): # bullet list in endpoint description if not self.field_list_visited: self.data['description'] += '\n\n' for child in node.traverse(): # process list item if isinstance(child, docutils.nodes.paragraph): line_text = self.process_paragraph(str(child)) self.data['description'] += '\t* %s\n' % line_text def unknown_visit(self, node): pass def depart_document(self, node): """ End of parsing extra processing """ default_methods = ['GET', 'HEAD', 'OPTIONS'] # ensure urls info is present and set default http methods if not self.data['urls']: for url in self.urls: self.data['urls'].append({'rule': url, 'methods': default_methods}) def unknown_departure(self, node): pass def _parse_httpdomain_doc(doc, data): doc_lines = doc.split('\n') doc_lines_filtered = [] urls = [] # httpdomain is a sphinx extension that is unknown to docutils but # fortunately we can still parse its directives' content, # so remove lines with httpdomain directives before executing the # rst parser from docutils for doc_line in doc_lines: if '.. http' not in doc_line: doc_lines_filtered.append(doc_line) else: url = doc_line[doc_line.find('/'):] # emphasize url arguments for html rendering url = re.sub(r'\((\w+)\)', r' **\(\1\)** ', url) urls.append(url) # parse the rst docstring and do not print system messages about # unknown httpdomain roles document = parse_rst('\n'.join(doc_lines_filtered), report_level=5) # remove the system_message nodes from the parsed document for node in document.traverse(docutils.nodes.system_message): node.parent.remove(node) # visit the document nodes to extract relevant endpoint info visitor = _HTTPDomainDocVisitor(document, urls, data) document.walkabout(visitor) class APIDocException(Exception): """ Custom exception to signal errors in the use of the APIDoc decorators """ class api_doc(object): # noqa: N801 """ Decorate an API function to register it in the API doc route index and create the corresponding DRF route. Args: route (str): documentation page's route noargs (boolean): set to True if the route has no arguments, and its result should be displayed anytime its documentation is requested. Default to False tags (list): Further information on api endpoints. Two values are possibly expected: * hidden: remove the entry points from the listing * upcoming: display the entry point but it is not followable handle_response (boolean): indicate if the decorated function takes care of creating the HTTP response or delegates that task to the apiresponse module api_version (str): api version string """ def __init__(self, route, noargs=False, tags=[], handle_response=False, api_version='1'): super().__init__() self.route = route self.urlpattern = '^' + api_version + route + '$' self.noargs = noargs self.tags = set(tags) self.handle_response = handle_response # @api_doc() Decorator call def __call__(self, f): # If the route is not hidden, add it to the index if 'hidden' not in self.tags: doc_data = self.get_doc_data(f) doc_desc = doc_data['description'] first_dot_pos = doc_desc.find('.') APIUrls.add_route(self.route, doc_desc[:first_dot_pos+1], tags=self.tags) # If the decorated route has arguments, we create a specific # documentation view if not self.noargs: @api_view(['GET', 'HEAD']) def doc_view(request): doc_data = self.get_doc_data(f) return make_api_response(request, None, doc_data) view_name = 'api-%s' % self.route[1:-1].replace('/', '-') APIUrls.add_url_pattern(self.urlpattern, doc_view, view_name) @wraps(f) def documented_view(request, **kwargs): doc_data = self.get_doc_data(f) try: response = f(request, **kwargs) except Exception as exc: return error_response(request, exc, doc_data) if self.handle_response: return response else: return make_api_response(request, response, doc_data) return documented_view @functools.lru_cache(maxsize=32) def get_doc_data(self, f): """ Build documentation data for the decorated api endpoint function """ data = { 'description': '', 'response_data': None, 'urls': [], 'args': [], 'params': [], 'resheaders': [], 'reqheaders': [], 'return_type': '', 'returns': [], 'status_codes': [], 'examples': [], 'route': self.route, 'noargs': self.noargs } if not f.__doc__: raise APIDocException('apidoc %s: expected a docstring' ' for function %s' % (self.__class__.__name__, f.__name__)) # use raw docstring as endpoint documentation if sphinx # httpdomain is not used if '.. http' not in f.__doc__: data['description'] = f.__doc__ # else parse the sphinx httpdomain docstring with docutils # (except when building the swh-web documentation through autodoc # sphinx extension, not needed and raise errors with sphinx >= 1.7) elif 'SWH_WEB_DOC_BUILD' not in os.environ: _parse_httpdomain_doc(f.__doc__, data) # process returned object info for nicer html display returns_list = '' for ret in data['returns']: returns_list += '\t* **%s (%s)**: %s\n' %\ (ret['name'], ret['type'], ret['doc']) data['returns_list'] = returns_list return data diff --git a/swh/web/api/views/content.py b/swh/web/api/views/content.py index 9859367e..75150861 100644 --- a/swh/web/api/views/content.py +++ b/swh/web/api/views/content.py @@ -1,404 +1,404 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import functools from django.http import HttpResponse from swh.web.common import service from swh.web.common.utils import reverse from swh.web.common.exc import NotFoundExc from swh.web.api.apidoc import api_doc from swh.web.api import utils from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup @api_route(r'/content/(?P.+)/provenance/', 'api-content-provenance') @api_doc('/content/provenance/', tags=['hidden']) def api_content_provenance(request, q): """Return content's provenance information if any. """ def _enrich_revision(provenance): p = provenance.copy() p['revision_url'] = \ reverse('api-revision', url_args={'sha1_git': provenance['revision']}) p['content_url'] = \ reverse('api-content', url_args={'q': 'sha1_git:%s' % provenance['content']}) p['origin_url'] = \ reverse('api-origin', url_args={'origin_id': provenance['origin']}) p['origin_visits_url'] = \ reverse('api-origin-visits', url_args={'origin_id': provenance['origin']}) p['origin_visit_url'] = \ reverse('api-origin-visit', url_args={'origin_id': provenance['origin'], 'visit_id': provenance['visit']}) return p return api_lookup( service.lookup_content_provenance, q, notfound_msg='Content with {} not found.'.format(q), enrich_fn=_enrich_revision) @api_route(r'/content/(?P.+)/filetype/', 'api-content-filetype') @api_doc('/content/filetype/') def api_content_filetype(request, q): """ .. http:get:: /api/1/content/[(hash_type):](hash)/filetype/ Get information about the detected MIME type of a content object. :param string hash_type: optional parameter specifying which hashing algorithm has been used - to compute the content checksum. It can be either *sha1*, *sha1_git*, *sha256* - or *blake2s256*. If that parameter is not provided, it is assumed that the - hashing algorithm used is *sha1*. + to compute the content checksum. It can be either ``sha1``, ``sha1_git``, ``sha256`` + or ``blake2s256``. If that parameter is not provided, it is assumed that the + hashing algorithm used is `sha1`. :param string hash: hexadecimal representation of the checksum value computed with the specified hashing algorithm. :>json object content_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/` for getting information about the content :>json string encoding: the detected content encoding - :>json string id: the *sha1* identifier of the content + :>json string id: the **sha1** identifier of the content :>json string mimetype: the detected MIME type of the content :>json object tool: information about the tool used to detect the content filetype :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested content can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`content/sha1:dc2830a9e72f23c1dfebef4413003221baa5fb62/filetype/` """ # noqa return api_lookup( service.lookup_content_filetype, q, notfound_msg='No filetype information found for content {}.'.format(q), enrich_fn=utils.enrich_metadata_endpoint) @api_route(r'/content/(?P.+)/language/', 'api-content-language') @api_doc('/content/language/') def api_content_language(request, q): """ .. http:get:: /api/1/content/[(hash_type):](hash)/language/ Get information about the programming language used in a content object. :param string hash_type: optional parameter specifying which hashing algorithm has been used - to compute the content checksum. It can be either *sha1*, *sha1_git*, *sha256* - or *blake2s256*. If that parameter is not provided, it is assumed that the - hashing algorithm used is *sha1*. + to compute the content checksum. It can be either ``sha1``, ``sha1_git``, ``sha256`` + or ``blake2s256``. If that parameter is not provided, it is assumed that the + hashing algorithm used is ``sha1``. :param string hash: hexadecimal representation of the checksum value computed with the specified hashing algorithm. :>json object content_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/` for getting information about the content - :>json string id: the *sha1* identifier of the content + :>json string id: the **sha1** identifier of the content :>json string lang: the detected programming language if any :>json object tool: information about the tool used to detect the programming language :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested content can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`content/sha1:dc2830a9e72f23c1dfebef4413003221baa5fb62/language/` """ # noqa return api_lookup( service.lookup_content_language, q, notfound_msg='No language information found for content {}.'.format(q), enrich_fn=utils.enrich_metadata_endpoint) @api_route(r'/content/(?P.+)/license/', 'api-content-license') @api_doc('/content/license/') def api_content_license(request, q): """ .. http:get:: /api/1/content/[(hash_type):](hash)/license/ Get information about the license of a content object. :param string hash_type: optional parameter specifying which hashing algorithm has been used - to compute the content checksum. It can be either *sha1*, *sha1_git*, *sha256* - or *blake2s256*. If that parameter is not provided, it is assumed that the - hashing algorithm used is *sha1*. + to compute the content checksum. It can be either ``sha1``, ``sha1_git``, ``sha256`` + or ``blake2s256``. If that parameter is not provided, it is assumed that the + hashing algorithm used is ``sha1``. :param string hash: hexadecimal representation of the checksum value computed with the specified hashing algorithm. :>json object content_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/` for getting information about the content - :>json string id: the *sha1* identifier of the content + :>json string id: the **sha1** identifier of the content :>json array licenses: array of strings containing the detected license names if any :>json object tool: information about the tool used to detect the license :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested content can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`content/sha1:dc2830a9e72f23c1dfebef4413003221baa5fb62/license/` """ # noqa return api_lookup( service.lookup_content_license, q, notfound_msg='No license information found for content {}.'.format(q), enrich_fn=utils.enrich_metadata_endpoint) @api_route(r'/content/(?P.+)/ctags/', 'api-content-ctags') @api_doc('/content/ctags/', tags=['hidden']) def api_content_ctags(request, q): """ Get information about all `Ctags `_-style symbols defined in a content object. """ return api_lookup( service.lookup_content_ctags, q, notfound_msg='No ctags symbol found for content {}.'.format(q), enrich_fn=utils.enrich_metadata_endpoint) @api_route(r'/content/(?P.+)/raw/', 'api-content-raw') @api_doc('/content/raw/', handle_response=True) def api_content_raw(request, q): """ .. http:get:: /api/1/content/[(hash_type):](hash)/raw/ Get the raw content of a content object (aka a "blob"), as a byte sequence. :param string hash_type: optional parameter specifying which hashing algorithm has been used - to compute the content checksum. It can be either *sha1*, *sha1_git*, *sha256* - or *blake2s256*. If that parameter is not provided, it is assumed that the - hashing algorithm used is *sha1*. + to compute the content checksum. It can be either ``sha1``, ``sha1_git``, ``sha256`` + or ``blake2s256``. If that parameter is not provided, it is assumed that the + hashing algorithm used is ``sha1``. :param string hash: hexadecimal representation of the checksum value computed with the specified hashing algorithm. :query string filename: if provided, the downloaded content will get that filename :resheader Content-Type: application/octet-stream **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested content can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`content/sha1:dc2830a9e72f23c1dfebef4413003221baa5fb62/raw/` """ # noqa def generate(content): yield content['data'] content_raw = service.lookup_content_raw(q) if not content_raw: raise NotFoundExc('Content %s is not found.' % q) filename = request.query_params.get('filename') if not filename: filename = 'content_%s_raw' % q.replace(':', '_') response = HttpResponse(generate(content_raw), content_type='application/octet-stream') response['Content-disposition'] = 'attachment; filename=%s' % filename return response @api_route(r'/content/symbol/(?P.+)/', 'api-content-symbol') @api_doc('/content/symbol/', tags=['hidden']) def api_content_symbol(request, q=None): """Search content objects by `Ctags `_-style symbol (e.g., function name, data type, method, ...). """ result = {} last_sha1 = request.query_params.get('last_sha1', None) per_page = int(request.query_params.get('per_page', '10')) def lookup_exp(exp, last_sha1=last_sha1, per_page=per_page): return service.lookup_expression(exp, last_sha1, per_page) symbols = api_lookup( lookup_exp, q, notfound_msg="No indexed raw content match expression '{}'.".format(q), enrich_fn=functools.partial(utils.enrich_content, top_url=True)) if symbols: nb_symbols = len(symbols) if nb_symbols == per_page: query_params = {} new_last_sha1 = symbols[-1]['sha1'] query_params['last_sha1'] = new_last_sha1 if request.query_params.get('per_page'): query_params['per_page'] = per_page result['headers'] = { 'link-next': reverse('api-content-symbol', url_args={'q': q}, query_params=query_params) } result.update({ 'results': symbols }) return result @api_route(r'/content/known/search/', 'api-content-known', methods=['POST']) @api_route(r'/content/known/(?P(?!search).*)/', 'api-content-known') @api_doc('/content/known/', tags=['hidden']) def api_check_content_known(request, q=None): """ .. http:get:: /api/1/content/known/(sha1)[,(sha1), ...,(sha1)]/ - Check whether some content(s) (aka "blob(s)") is present in the SWH archive - based on its *sha1* checksum. + Check whether some content(s) (aka "blob(s)") is present in the archive + based on its **sha1** checksum. - :param string sha1: hexadecimal representation of the *sha1* checksum value + :param string sha1: hexadecimal representation of the **sha1** checksum value for the content to check existence. Multiple values can be provided separated by ','. :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request - :>json array search_res: array holding the search result for each provided *sha1* - :>json object search_stats: some statistics regarding the number of *sha1* provided - and the percentage of those found in the SWH archive + :>json array search_res: array holding the search result for each provided **sha1** + :>json object search_stats: some statistics regarding the number of **sha1** provided + and the percentage of those found in the archive **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1* has been provided + :statuscode 400: an invalid **sha1** has been provided **Example:** .. parsed-literal:: :swh_web_api:`content/known/dc2830a9e72f23c1dfebef4413003221baa5fb62,0c3f19cb47ebfbe643fb19fa94c874d18fa62d12/` """ # noqa response = {'search_res': None, 'search_stats': None} search_stats = {'nbfiles': 0, 'pct': 0} search_res = None queries = [] # GET: Many hash separated values request if q: hashes = q.split(',') for v in hashes: queries.append({'filename': None, 'sha1': v}) # POST: Many hash requests in post form submission elif request.method == 'POST': data = request.data # Remove potential inputs with no associated value for k, v in data.items(): if v is not None: if k == 'q' and len(v) > 0: queries.append({'filename': None, 'sha1': v}) elif v != '': queries.append({'filename': k, 'sha1': v}) if queries: lookup = service.lookup_multiple_hashes(queries) result = [] nb_queries = len(queries) for el in lookup: res_d = {'sha1': el['sha1'], 'found': el['found']} if 'filename' in el and el['filename']: res_d['filename'] = el['filename'] result.append(res_d) search_res = result nbfound = len([x for x in lookup if x['found']]) search_stats['nbfiles'] = nb_queries search_stats['pct'] = (nbfound / nb_queries) * 100 response['search_res'] = search_res response['search_stats'] = search_stats return response @api_route(r'/content/(?P.+)/', 'api-content') @api_doc('/content/') def api_content_metadata(request, q): """ .. http:get:: /api/1/content/[(hash_type):](hash)/ Get information about a content (aka a "blob") object. - In the SWH archive, a content object is identified based on checksum + In the archive, a content object is identified based on checksum values computed using various hashing algorithms. :param string hash_type: optional parameter specifying which hashing algorithm has been used - to compute the content checksum. It can be either *sha1*, *sha1_git*, *sha256* - or *blake2s256*. If that parameter is not provided, it is assumed that the - hashing algorithm used is *sha1*. + to compute the content checksum. It can be either ``sha1``, ``sha1_git``, ``sha256`` + or ``blake2s256``. If that parameter is not provided, it is assumed that the + hashing algorithm used is ``sha1``. :param string hash: hexadecimal representation of the checksum value computed with the specified hashing algorithm. :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json object checksums: object holding the computed checksum values for the requested content :>json string data_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/raw/` for downloading the content raw bytes :>json string filetype_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/filetype/` for getting information about the content MIME type :>json string language_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/language/` for getting information about the programming language used in the content :>json number length: length of the content in bytes :>json string license_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/license/` for getting information about the license of the content **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested content can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested content can not be found in the archive **Example:** .. parsed-literal:: curl -i :swh_web_api:`content/sha1_git:fe95a46679d128ff167b7c55df5d02356c5a1ae1/` """ # noqa return api_lookup( service.lookup_content, q, notfound_msg='Content with {} not found.'.format(q), enrich_fn=functools.partial(utils.enrich_content, query_string=q)) diff --git a/swh/web/api/views/directory.py b/swh/web/api/views/directory.py index a6dbe2b9..c17902ee 100644 --- a/swh/web/api/views/directory.py +++ b/swh/web/api/views/directory.py @@ -1,75 +1,75 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common import service from swh.web.api import utils from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup @api_route(r'/directory/(?P[0-9a-f]+)/', 'api-directory') @api_route(r'/directory/(?P[0-9a-f]+)/(?P.+)/', 'api-directory') @api_doc('/directory/') def api_directory(request, sha1_git, path=None): """ .. http:get:: /api/1/directory/(sha1_git)/[(path)/] Get information about directory objects. - Directories are identified by *sha1* checksums, compatible with Git directory identifiers. + Directories are identified by **sha1** checksums, compatible with Git directory identifiers. See :func:`swh.model.identifiers.directory_identifier` in our data model module for details about how they are computed. When given only a directory identifier, this endpoint returns information about the directory itself, returning its content (usually a list of directory entries). When given a directory identifier and a path, this endpoint returns information about the directory entry pointed by the relative path, starting path resolution from the given directory. - :param string sha1_git: hexadecimal representation of the directory *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the directory **sha1_git** identifier :param string path: optional parameter to get information about the directory entry pointed by that relative path :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>jsonarr object checksums: object holding the computed checksum values for a directory entry (only for file entries) - :>jsonarr string dir_id: *sha1_git* identifier of the requested directory + :>jsonarr string dir_id: **sha1_git** identifier of the requested directory :>jsonarr number length: length of a directory entry in bytes (only for file entries) for getting information about the content MIME type :>jsonarr string name: the directory entry name :>jsonarr number perms: permissions for the directory entry - :>jsonarr string target: *sha1_git* identifier of the directory entry + :>jsonarr string target: **sha1_git** identifier of the directory entry :>jsonarr string target_url: link to :http:get:`/api/1/content/[(hash_type):](hash)/` or :http:get:`/api/1/directory/(sha1_git)/[(path)/]` depending on the directory entry type - :>jsonarr string type: the type of the directory entry, can be either *dir*, *file* or *rev* + :>jsonarr string type: the type of the directory entry, can be either ``dir``, ``file`` or ``rev`` **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *hash_type* or *hash* has been provided - :statuscode 404: requested directory can not be found in the SWH archive + :statuscode 400: an invalid **hash_type** or **hash** has been provided + :statuscode 404: requested directory can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`directory/977fc4b98c0e85816348cebd3b12026407c368b6/` """ # noqa if path: error_msg_path = ('Entry with path %s relative to directory ' 'with sha1_git %s not found.') % (path, sha1_git) return api_lookup( service.lookup_directory_with_path, sha1_git, path, notfound_msg=error_msg_path, enrich_fn=utils.enrich_directory) else: error_msg_nopath = 'Directory with sha1_git %s not found.' % sha1_git return api_lookup( service.lookup_directory, sha1_git, notfound_msg=error_msg_nopath, enrich_fn=utils.enrich_directory) diff --git a/swh/web/api/views/identifiers.py b/swh/web/api/views/identifiers.py index a1499b95..06896827 100644 --- a/swh/web/api/views/identifiers.py +++ b/swh/web/api/views/identifiers.py @@ -1,77 +1,77 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.model.identifiers import ( CONTENT, DIRECTORY, RELEASE, REVISION, SNAPSHOT ) from swh.web.common import service from swh.web.common.utils import resolve_swh_persistent_id from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route @api_route(r'/resolve/(?P.*)/', 'api-resolve-swh-pid') @api_doc('/resolve/') def api_resolve_swh_pid(request, swh_id): """ .. http:get:: /api/1/resolve/(swh_id)/ Resolve a Software Heritage persistent identifier. Try to resolve a provided `persistent identifier `_ into an url for browsing the pointed archive object. If the provided identifier is valid, the existence of the object in the archive will also be checked. - :param string swh_id: a SWH presistent identifier + :param string swh_id: a Software Heritage presistent identifier :>json string browse_url: the url for browsing the pointed object :>json object metadata: object holding optional parts of the persistent identifier :>json string namespace: the persistent identifier namespace :>json string object_id: the hash identifier of the pointed object :>json string object_type: the type of the pointed object :>json number scheme_version: the scheme version of the persistent identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid persistent identifier has been provided :statuscode 404: the pointed object does not exist in the archive **Example:** .. parsed-literal:: :swh_web_api:`resolve/swh:1:rev:96db9023b881d7cd9f379b0c154650d6c108e9a3;origin=https://github.com/openssl/openssl/` """ # noqa # try to resolve the provided pid swh_id_resolved = resolve_swh_persistent_id(swh_id) # id is well-formed, now check that the pointed # object is present in the archive, NotFoundExc # will be raised otherwise swh_id_parsed = swh_id_resolved['swh_id_parsed'] object_type = swh_id_parsed.object_type object_id = swh_id_parsed.object_id if object_type == CONTENT: service.lookup_content('sha1_git:%s' % object_id) elif object_type == DIRECTORY: service.lookup_directory(object_id) elif object_type == RELEASE: service.lookup_release(object_id) elif object_type == REVISION: service.lookup_revision(object_id) elif object_type == SNAPSHOT: service.lookup_snapshot(object_id) # id is well-formed and the pointed object exists swh_id_data = swh_id_parsed._asdict() swh_id_data['browse_url'] = swh_id_resolved['browse_url'] return swh_id_data diff --git a/swh/web/api/views/origin.py b/swh/web/api/views/origin.py index 5a0f12b3..223cce98 100644 --- a/swh/web/api/views/origin.py +++ b/swh/web/api/views/origin.py @@ -1,330 +1,332 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from distutils.util import strtobool from swh.web.common import service from swh.web.common.utils import ( reverse, get_origin_visits ) from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup def _enrich_origin(origin): if 'id' in origin: o = origin.copy() o['origin_visits_url'] = \ reverse('api-origin-visits', url_args={'origin_id': origin['id']}) return o return origin @api_route(r'/origin/(?P[0-9]+)/', 'api-origin') @api_route(r'/origin/(?P[a-z]+)/url/(?P.+)/', 'api-origin') @api_doc('/origin/') def api_origin(request, origin_id=None, origin_type=None, origin_url=None): """ .. http:get:: /api/1/origin/(origin_id)/ Get information about a software origin. - :param int origin_id: a SWH origin identifier + :param int origin_id: a software origin identifier :>json number id: the origin unique identifier - :>json string origin_visits_url: link to in order to get information about the SWH + :>json string origin_visits_url: link to in order to get information about the visits for that origin - :>json string type: the type of software origin (*git*, *svn*, *hg*, *deb*, *ftp*, ...) + :>json string type: the type of software origin (possible values are ``git``, ``svn``, + ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :>json string url: the origin canonical url :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`origin/1/` .. http:get:: /api/1/origin/(origin_type)/url/(origin_url)/ Get information about a software origin. - :param string origin_type: the origin type (*git*, *svn*, *hg*, *deb*, *ftp*, ...) + :param string origin_type: the origin type (possible values are ``git``, ``svn``, + ``hg``, ``deb``, ``pypi``, ``ftp`` or ``deposit``) :param string origin_url: the origin url :>json number id: the origin unique identifier - :>json string origin_visits_url: link to in order to get information about the SWH + :>json string origin_visits_url: link to in order to get information about the visits for that origin - :>json string type: the type of software origin (*git*, *svn*, *hg*, *deb*, *ftp*, ...) + :>json string type: the type of software origin :>json string url: the origin canonical url :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`origin/git/url/https://github.com/python/cpython/` """ # noqa ori_dict = { 'id': origin_id, 'type': origin_type, 'url': origin_url } ori_dict = {k: v for k, v in ori_dict.items() if ori_dict[k]} if 'id' in ori_dict: error_msg = 'Origin with id %s not found.' % ori_dict['id'] else: error_msg = 'Origin with type %s and URL %s not found' % ( ori_dict['type'], ori_dict['url']) return api_lookup( service.lookup_origin, ori_dict, notfound_msg=error_msg, enrich_fn=_enrich_origin) @api_route(r'/origin/search/(?P.+)/', 'api-origin-search') @api_doc('/origin/search/') def api_origin_search(request, url_pattern): """ .. http:get:: /api/1/origin/search/(url_pattern)/ Search for software origins whose urls contain a provided string pattern or match a provided regular expression. The search is performed in a case insensitive way. :param string url_pattern: a string pattern or a regular expression :query int offset: the number of found origins to skip before returning results :query int limit: the maximum number of found origins to return :query boolean regexp: if true, consider provided pattern as a regular expression and search origins whose urls match it :query boolean with_visit: if true, only return origins with at least one visit by Software heritage :>jsonarr number id: the origin unique identifier - :>jsonarr string origin_visits_url: link to in order to get information about the SWH + :>jsonarr string origin_visits_url: link to in order to get information about the visits for that origin - :>jsonarr string type: the type of software origin (*git*, *svn*, *hg*, *deb*, *ftp*, ...) + :>jsonarr string type: the type of software origin :>jsonarr string url: the origin canonical url :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error **Example:** .. parsed-literal:: :swh_web_api:`origin/search/python/?limit=2` """ # noqa result = {} offset = int(request.query_params.get('offset', '0')) limit = int(request.query_params.get('limit', '70')) regexp = request.query_params.get('regexp', 'false') with_visit = request.query_params.get('with_visit', 'false') results = api_lookup(service.search_origin, url_pattern, offset, limit, bool(strtobool(regexp)), bool(strtobool(with_visit)), enrich_fn=_enrich_origin) nb_results = len(results) if nb_results == limit: query_params = {} query_params['offset'] = offset + limit query_params['limit'] = limit query_params['regexp'] = regexp result['headers'] = { 'link-next': reverse('api-origin-search', url_args={'url_pattern': url_pattern}, query_params=query_params) } result.update({ 'results': results }) return result @api_route(r'/origin/(?P[0-9]+)/visits/', 'api-origin-visits') @api_doc('/origin/visits/') def api_origin_visits(request, origin_id): """ .. http:get:: /api/1/origin/(origin_id)/visits/ Get information about all visits of a software origin. Visits are returned sorted in descending order according to their date. - :param int origin_id: a SWH origin identifier + :param int origin_id: a software origin identifier :query int per_page: specify the number of visits to list, for pagination purposes :query int last_visit: visit to start listing from, for pagination purposes :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :resheader Link: indicates that a subsequent result page is available and contains the url pointing to it :>jsonarr string date: ISO representation of the visit date (in UTC) :>jsonarr number id: the unique identifier of the origin :>jsonarr string origin_visit_url: link to :http:get:`/api/1/origin/(origin_id)/visit/(visit_id)/` in order to get information about the visit :>jsonarr string snapshot: the snapshot identifier of the visit :>jsonarr string snapshot_url: link to :http:get:`/api/1/snapshot/(snapshot_id)/` in order to get information about the snapshot of the visit - :>jsonarr string status: status of the visit (either *full*, *partial* or *ongoing*) + :>jsonarr string status: status of the visit (either **full**, **partial** or **ongoing**) :>jsonarr number visit: the unique identifier of the visit **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: requested origin can not be found in the SWH archive + :statuscode 404: requested origin can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`origin/1/visits/` """ # noqa result = {} per_page = int(request.query_params.get('per_page', '10')) last_visit = request.query_params.get('last_visit') if last_visit: last_visit = int(last_visit) def _lookup_origin_visits( origin_id, last_visit=last_visit, per_page=per_page): all_visits = get_origin_visits({'id': origin_id}) all_visits.reverse() visits = [] if not last_visit: visits = all_visits[:per_page] else: for i, v in enumerate(all_visits): if v['visit'] == last_visit: visits = all_visits[i+1:i+1+per_page] break for v in visits: yield v def _enrich_origin_visit(origin_visit): ov = origin_visit.copy() ov['origin_visit_url'] = reverse('api-origin-visit', url_args={'origin_id': origin_id, 'visit_id': ov['visit']}) snapshot = ov['snapshot'] if snapshot: ov['snapshot_url'] = reverse('api-snapshot', url_args={'snapshot_id': snapshot}) else: ov['snapshot_url'] = None return ov results = api_lookup(_lookup_origin_visits, origin_id, notfound_msg='No origin {} found'.format(origin_id), enrich_fn=_enrich_origin_visit) if results: nb_results = len(results) if nb_results == per_page: new_last_visit = results[-1]['visit'] query_params = {} query_params['last_visit'] = new_last_visit if request.query_params.get('per_page'): query_params['per_page'] = per_page result['headers'] = { 'link-next': reverse('api-origin-visits', url_args={'origin_id': origin_id}, query_params=query_params) } result.update({ 'results': results }) return result @api_route(r'/origin/(?P[0-9]+)/visit/(?P[0-9]+)/', 'api-origin-visit') @api_doc('/origin/visit/') def api_origin_visit(request, origin_id, visit_id): """ .. http:get:: /api/1/origin/(origin_id)/visit/(visit_id)/ Get information about a specific visit of a software origin. - :param int origin_id: a SWH origin identifier + :param int origin_id: a software origin identifier :param int visit_id: a visit identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json string date: ISO representation of the visit date (in UTC) :>json number origin: the origin unique identifier :>json string origin_url: link to get information about the origin :>jsonarr string snapshot: the snapshot identifier of the visit :>jsonarr string snapshot_url: link to :http:get:`/api/1/snapshot/(snapshot_id)/` in order to get information about the snapshot of the visit - :>json string status: status of the visit (either *full*, *partial* or *ongoing*) + :>json string status: status of the visit (either **full**, **partial** or **ongoing**) :>json number visit: the unique identifier of the visit **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: requested origin or visit can not be found in the SWH archive + :statuscode 404: requested origin or visit can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`origin/1500/visit/1/` """ # noqa def _enrich_origin_visit(origin_visit): ov = origin_visit.copy() ov['origin_url'] = reverse('api-origin', url_args={'origin_id': ov['origin']}) snapshot = ov['snapshot'] if snapshot: ov['snapshot_url'] = reverse('api-snapshot', url_args={'snapshot_id': snapshot}) else: ov['snapshot_url'] = None return ov return api_lookup( service.lookup_origin_visit, origin_id, visit_id, notfound_msg=('No visit {} for origin {} found' .format(visit_id, origin_id)), enrich_fn=_enrich_origin_visit) diff --git a/swh/web/api/views/origin_save.py b/swh/web/api/views/origin_save.py index bf694908..7c74324f 100644 --- a/swh/web/api/views/origin_save.py +++ b/swh/web/api/views/origin_save.py @@ -1,79 +1,79 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.views.decorators.cache import never_cache from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.common.origin_save import ( create_save_origin_request, get_save_origin_requests ) @api_route(r'/origin/save/(?P.+)/url/(?P.+)/', 'api-save-origin', methods=['GET', 'POST'], throttle_scope='swh_save_origin') @never_cache @api_doc('/origin/save/') def api_save_origin(request, origin_type, origin_url): """ .. http:get:: /api/1/origin/save/(origin_type)/url/(origin_url)/ .. http:post:: /api/1/origin/save/(origin_type)/url/(origin_url)/ Request the saving of a software origin into the archive or check the status of previously created save requests. That endpoint enables to create a saving task for a software origin through a POST request. Depending of the provided origin url, the save request can either be: * immediately **accepted**, for well known code hosting providers like for instance GitHub or GitLab * **rejected**, in case the url is blacklisted by Software Heritage * **put in pending state** until a manual check is done in order to determine if it can be loaded or not Once a saving request has been accepted, its associated saving task status can then be checked through a GET request on the same url. Returned status can either be: * **not created**: no saving task has been created * **not yet scheduled**: saving task has been created but its execution has not yet been scheduled * **scheduled**: the task execution has been scheduled * **succeed**: the saving task has been successfully executed * **failed**: the saving task has been executed but it failed When issuing a POST request an object will be returned while a GET request will return an array of objects (as multiple save requests might have been submitted for the same origin). :param string origin_type: the type of origin to save - (currently only *git* but *hg* and *svn* will soon be available) + (currently only ``git`` but ``hg`` and ``svn`` will soon be available) :param string origin_url: the url of the origin to save :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json string origin_url: the url of the origin to save :>json string origin_type: the type of the origin to save :>json string save_request_date: the date (in iso format) the save request was issued - :>json string save_request_status: the status of the save request, either *accepted*, - *rejected* or *pending* - :>json string save_task_status: the status of the origin saving task, either *not created*, - *not yet scheduled*, *scheduled*, *succeed* or *failed* + :>json string save_request_status: the status of the save request, either **accepted**, + **rejected** or **pending** + :>json string save_task_status: the status of the origin saving task, either **not created**, + **not yet scheduled**, **scheduled**, **succeed** or **failed** **Allowed HTTP Methods:** :http:method:`get`, :http:method:`post`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid origin type or url has been provided :statuscode 403: the provided origin url is blacklisted """ # noqa if request.method == 'POST': return create_save_origin_request(origin_type, origin_url) else: return get_save_origin_requests(origin_type, origin_url) diff --git a/swh/web/api/views/person.py b/swh/web/api/views/person.py index 0792dace..628ef7a9 100644 --- a/swh/web/api/views/person.py +++ b/swh/web/api/views/person.py @@ -1,44 +1,44 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common import service from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup @api_route(r'/person/(?P[0-9]+)/', 'api-person') @api_doc('/person/') def api_person(request, person_id): """ .. http:get:: /api/1/person/(person_id)/ - Get information about a person in the SWH archive. + Get information about a person in the archive. - :param int person_id: a SWH person identifier + :param int person_id: a person identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json string email: the email of the person :>json string fullname: the full name of the person: combination of its name and email :>json number id: the unique identifier of the person :>json string name: the name of the person **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: requested person can not be found in the SWH archive + :statuscode 404: requested person can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`person/8275/` """ # noqa return api_lookup( service.lookup_person, person_id, notfound_msg='Person with id {} not found.'.format(person_id)) diff --git a/swh/web/api/views/release.py b/swh/web/api/views/release.py index 8abfcf8e..c0e168ec 100644 --- a/swh/web/api/views/release.py +++ b/swh/web/api/views/release.py @@ -1,58 +1,58 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common import service from swh.web.api import utils from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup @api_route(r'/release/(?P[0-9a-f]+)/', 'api-release') @api_doc('/release/') def api_release(request, sha1_git): """ .. http:get:: /api/1/release/(sha1_git)/ - Get information about a release in the SWH archive. - Releases are identified by *sha1* checksums, compatible with Git tag identifiers. + Get information about a release in the archive. + Releases are identified by **sha1** checksums, compatible with Git tag identifiers. See :func:`swh.model.identifiers.release_identifier` in our data model module for details about how they are computed. - :param string sha1_git: hexadecimal representation of the release *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the release **sha1_git** identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json object author: information about the author of the release :>json string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the release :>json string date: ISO representation of the release date (in UTC) :>json string id: the release unique identifier :>json string message: the message associated to the release :>json string name: the name of the release :>json string target: the target identifier of the release - :>json string target_type: the type of the target, can be either *release*, - *revision*, *content*, *directory* + :>json string target_type: the type of the target, can be either **release**, + **revision**, **content**, **directory** :>json string target_url: a link to the adequate api url based on the target type **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested release can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested release can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`release/208f61cc7a5dbc9879ae6e5c2f95891e270f09ef/` """ # noqa error_msg = 'Release with sha1_git %s not found.' % sha1_git return api_lookup( service.lookup_release, sha1_git, notfound_msg=error_msg, enrich_fn=utils.enrich_release) diff --git a/swh/web/api/views/revision.py b/swh/web/api/views/revision.py index f15606ff..891c6074 100644 --- a/swh/web/api/views/revision.py +++ b/swh/web/api/views/revision.py @@ -1,505 +1,505 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.http import HttpResponse from swh.web.common import service from swh.web.common.utils import reverse from swh.web.common.utils import parse_timestamp from swh.web.api import utils from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup def _revision_directory_by(revision, path, request_path, limit=100, with_data=False): """ Compute the revision matching criterion's directory or content data. Args: revision: dictionary of criterions representing a revision to lookup path: directory's path to lookup request_path: request path which holds the original context to limit: optional query parameter to limit the revisions log (default to 100). For now, note that this limit could impede the transitivity conclusion about sha1_git not being an ancestor of with_data: indicate to retrieve the content's raw data if path resolves to a content. """ def enrich_directory_local(dir, context_url=request_path): return utils.enrich_directory(dir, context_url) rev_id, result = service.lookup_directory_through_revision( revision, path, limit=limit, with_data=with_data) content = result['content'] if result['type'] == 'dir': # dir_entries result['content'] = list(map(enrich_directory_local, content)) else: # content result['content'] = utils.enrich_content(content) return result @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/log/', 'api-revision-origin-log') @api_route(r'/revision/origin/(?P[0-9]+)/log/', 'api-revision-origin-log') @api_route(r'/revision/origin/(?P[0-9]+)' r'/ts/(?P.+)/log/', 'api-revision-origin-log') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)' r'/ts/(?P.+)/log/', 'api-revision-origin-log') @api_doc('/revision/origin/log/') def api_revision_log_by(request, origin_id, branch_name='refs/heads/master', ts=None): """ .. http:get:: /api/1/revision/origin/(origin_id)[/branch/(branch_name)][/ts/(timestamp)]/log Show the commit log for a revision, searching for it based on software origin, branch name, and/or visit timestamp. This endpoint behaves like :http:get:`/api/1/revision/(sha1_git)[/prev/(prev_sha1s)]/log/`, but operates on the revision that has been found at a given software origin, close to a given point in time, pointed by a given branch. - :param int origin_id: a SWH origin identifier + :param int origin_id: a software origin identifier :param string branch_name: optional parameter specifying a fully-qualified branch name associated to the software origin, e.g., "refs/heads/master". Defaults to the master branch. :param string timestamp: optional parameter specifying a timestamp close to which the revision pointed by the given branch should be looked up. The timestamp can be expressed either as an ISO date or as a Unix one (in UTC). Defaults to now. :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>jsonarr object author: information about the author of the revision :>jsonarr string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the revision :>jsonarr object committer: information about the committer of the revision :>jsonarr string committer_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the committer of the revision :>jsonarr string committer_date: ISO representation of the commit date (in UTC) :>jsonarr string date: ISO representation of the revision date (in UTC) :>jsonarr string directory: the unique identifier that revision points to :>jsonarr string directory_url: link to :http:get:`/api/1/directory/(sha1_git)/[(path)/]` to get information about the directory associated to the revision :>jsonarr string id: the revision unique identifier :>jsonarr boolean merge: whether or not the revision corresponds to a merge commit :>jsonarr string message: the message associated to the revision :>jsonarr array parents: the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to :http:get:`/api/1/revision/(sha1_git)/` to get more information about it :>jsonarr string type: the type of the revision **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: no revision matching the given criteria could be found in the SWH archive + :statuscode 404: no revision matching the given criteria could be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`revision/origin/723566/ts/2016-01-17T00:00:00+00:00/log/` """ # noqa result = {} per_page = int(request.query_params.get('per_page', '10')) if ts: ts = parse_timestamp(ts) def lookup_revision_log_by_with_limit(o_id, br, ts, limit=per_page+1): return service.lookup_revision_log_by(o_id, br, ts, limit) error_msg = 'No revision matching origin %s ' % origin_id error_msg += ', branch name %s' % branch_name error_msg += (' and time stamp %s.' % ts) if ts else '.' rev_get = api_lookup( lookup_revision_log_by_with_limit, origin_id, branch_name, ts, notfound_msg=error_msg, enrich_fn=utils.enrich_revision) nb_rev = len(rev_get) if nb_rev == per_page+1: revisions = rev_get[:-1] last_sha1_git = rev_get[-1]['id'] params = {k: v for k, v in {'origin_id': origin_id, 'branch_name': branch_name, 'ts': ts, }.items() if v is not None} query_params = {} query_params['sha1_git'] = last_sha1_git if request.query_params.get('per_page'): query_params['per_page'] = per_page result['headers'] = { 'link-next': reverse('api-revision-origin-log', url_args=params, query_params=query_params) } else: revisions = rev_get result.update({'results': revisions}) return result @api_route(r'/revision/origin/(?P[0-9]+)/directory/', 'api-revision-origin-directory') @api_route(r'/revision/origin/(?P[0-9]+)/directory/(?P.+)/', 'api-revision-origin-directory') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/directory/', 'api-revision-origin-directory') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/ts/(?P.+)/directory/', 'api-revision-origin-directory') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/directory/(?P.+)/', 'api-revision-origin-directory') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/ts/(?P.+)' r'/directory/(?P.+)/', 'api-revision-origin-directory') @api_doc('/revision/origin/directory/', tags=['hidden']) def api_directory_through_revision_origin(request, origin_id, branch_name="refs/heads/master", ts=None, path=None, with_data=False): """ Display directory or content information through a revision identified by origin/branch/timestamp. """ if ts: ts = parse_timestamp(ts) return _revision_directory_by({'origin_id': origin_id, 'branch_name': branch_name, 'ts': ts }, path, request.path, with_data=with_data) @api_route(r'/revision/origin/(?P[0-9]+)/', 'api-revision-origin') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/', 'api-revision-origin') @api_route(r'/revision/origin/(?P[0-9]+)' r'/branch/(?P.+)/ts/(?P.+)/', 'api-revision-origin') @api_route(r'/revision/origin/(?P[0-9]+)/ts/(?P.+)/', 'api-revision-origin') @api_doc('/revision/origin/') def api_revision_with_origin(request, origin_id, branch_name="refs/heads/master", ts=None): """ .. http:get:: /api/1/revision/origin/(origin_id)/[branch/(branch_name)/][ts/(timestamp)/] Get information about a revision, searching for it based on software origin, branch name, and/or visit timestamp. This endpoint behaves like :http:get:`/api/1/revision/(sha1_git)/`, but operates on the revision that has been found at a given software origin, close to a given point in time, pointed by a given branch. - :param int origin_id: a SWH origin identifier + :param int origin_id: a software origin identifier :param string branch_name: optional parameter specifying a fully-qualified branch name associated to the software origin, e.g., "refs/heads/master". Defaults to the master branch. :param string timestamp: optional parameter specifying a timestamp close to which the revision pointed by the given branch should be looked up. The timestamp can be expressed either as an ISO date or as a Unix one (in UTC). Defaults to now. :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json object author: information about the author of the revision :>json string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the revision :>json object committer: information about the committer of the revision :>json string committer_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the committer of the revision :>json string committer_date: ISO representation of the commit date (in UTC) :>json string date: ISO representation of the revision date (in UTC) :>json string directory: the unique identifier that revision points to :>json string directory_url: link to :http:get:`/api/1/directory/(sha1_git)/[(path)/]` to get information about the directory associated to the revision :>json string id: the revision unique identifier :>json boolean merge: whether or not the revision corresponds to a merge commit :>json string message: the message associated to the revision :>json array parents: the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to :http:get:`/api/1/revision/(sha1_git)/` to get more information about it :>json string type: the type of the revision **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 404: no revision matching the given criteria could be found in the SWH archive + :statuscode 404: no revision matching the given criteria could be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`revision/origin/13706355/branch/refs/heads/2.7/` """ # noqa ts = parse_timestamp(ts) return api_lookup( service.lookup_revision_by, origin_id, branch_name, ts, notfound_msg=('Revision with (origin_id: {}, branch_name: {}' ', ts: {}) not found.'.format(origin_id, branch_name, ts)), enrich_fn=utils.enrich_revision) @api_route(r'/revision/(?P[0-9a-f]+)/prev/(?P[0-9a-f/]+)/', 'api-revision-context') @api_doc('/revision/prev/', tags=['hidden']) def api_revision_with_context(request, sha1_git, context): """ Return information about revision with id sha1_git. """ def _enrich_revision(revision, context=context): return utils.enrich_revision(revision, context) return api_lookup( service.lookup_revision, sha1_git, notfound_msg='Revision with sha1_git %s not found.' % sha1_git, enrich_fn=_enrich_revision) @api_route(r'/revision/(?P[0-9a-f]+)/', 'api-revision') @api_doc('/revision/') def api_revision(request, sha1_git): """ .. http:get:: /api/1/revision/(sha1_git)/ - Get information about a revision in the SWH archive. - Revisions are identified by *sha1* checksums, compatible with Git commit identifiers. + Get information about a revision in the archive. + Revisions are identified by **sha1** checksums, compatible with Git commit identifiers. See :func:`swh.model.identifiers.revision_identifier` in our data model module for details about how they are computed. - :param string sha1_git: hexadecimal representation of the revision *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the revision **sha1_git** identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json object author: information about the author of the revision :>json string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the revision :>json object committer: information about the committer of the revision :>json string committer_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the committer of the revision :>json string committer_date: ISO representation of the commit date (in UTC) :>json string date: ISO representation of the revision date (in UTC) :>json string directory: the unique identifier that revision points to :>json string directory_url: link to :http:get:`/api/1/directory/(sha1_git)/[(path)/]` to get information about the directory associated to the revision :>json string id: the revision unique identifier :>json boolean merge: whether or not the revision corresponds to a merge commit :>json string message: the message associated to the revision :>json array parents: the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to :http:get:`/api/1/revision/(sha1_git)/` to get more information about it :>json string type: the type of the revision **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested revision can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`revision/aafb16d69fd30ff58afdd69036a26047f3aebdc6/` """ # noqa return api_lookup( service.lookup_revision, sha1_git, notfound_msg='Revision with sha1_git {} not found.'.format(sha1_git), enrich_fn=utils.enrich_revision) @api_route(r'/revision/(?P[0-9a-f]+)/raw/', 'api-revision-raw-message') @api_doc('/revision/raw/', tags=['hidden'], handle_response=True) def api_revision_raw_message(request, sha1_git): """Return the raw data of the message of revision identified by sha1_git """ raw = service.lookup_revision_message(sha1_git) response = HttpResponse(raw['message'], content_type='application/octet-stream') response['Content-disposition'] = \ 'attachment;filename=rev_%s_raw' % sha1_git return response @api_route(r'/revision/(?P[0-9a-f]+)/directory/', 'api-revision-directory') @api_route(r'/revision/(?P[0-9a-f]+)/directory/(?P.+)/', 'api-revision-directory') @api_doc('/revision/directory/') def api_revision_directory(request, sha1_git, dir_path=None, with_data=False): """ .. http:get:: /api/1/revision/(sha1_git)/directory/[(path)/] Get information about directory (entry) objects associated to revisions. Each revision is associated to a single "root" directory. This endpoint behaves like :http:get:`/api/1/directory/(sha1_git)/[(path)/]`, but operates on the root directory associated to a given revision. - :param string sha1_git: hexadecimal representation of the revision *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the revision **sha1_git** identifier :param string path: optional parameter to get information about the directory entry pointed by that relative path :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json array content: directory entries as returned by :http:get:`/api/1/directory/(sha1_git)/[(path)/]` :>json string path: path of directory from the revision root one :>json string revision: the unique revision identifier :>json string type: the type of the directory **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested revision can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`revision/f1b94134a4b879bc55c3dacdb496690c8ebdc03f/directory/` """ # noqa return _revision_directory_by({'sha1_git': sha1_git}, dir_path, request.path, with_data=with_data) @api_route(r'/revision/(?P[0-9a-f]+)/log/', 'api-revision-log') @api_route(r'/revision/(?P[0-9a-f]+)' r'/prev/(?P[0-9a-f/]+)/log/', 'api-revision-log') @api_doc('/revision/log/') def api_revision_log(request, sha1_git, prev_sha1s=None): """ .. http:get:: /api/1/revision/(sha1_git)[/prev/(prev_sha1s)]/log/ - Get a list of all SWH revisions heading to a given one, in other words show the commit log. + Get a list of all revisions heading to a given one, in other words show the commit log. - :param string sha1_git: hexadecimal representation of the revision *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the revision **sha1_git** identifier :param string prev_sha1s: optional parameter representing the navigation breadcrumbs (descendant revisions previously visited). If multiple values, use / as delimiter. If provided, revisions information will be added at the beginning of the returned list. :query int per_page: number of elements in the returned list, for pagination purpose :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :resheader Link: indicates that a subsequent result page is available and contains the url pointing to it :>jsonarr object author: information about the author of the revision :>jsonarr string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the revision :>jsonarr object committer: information about the committer of the revision :>jsonarr string committer_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the committer of the revision :>jsonarr string committer_date: ISO representation of the commit date (in UTC) :>jsonarr string date: ISO representation of the revision date (in UTC) :>jsonarr string directory: the unique identifier that revision points to :>jsonarr string directory_url: link to :http:get:`/api/1/directory/(sha1_git)/[(path)/]` to get information about the directory associated to the revision :>jsonarr string id: the revision unique identifier :>jsonarr boolean merge: whether or not the revision corresponds to a merge commit :>jsonarr string message: the message associated to the revision :>jsonarr array parents: the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to :http:get:`/api/1/revision/(sha1_git)/` to get more information about it :>jsonarr string type: the type of the revision **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested revision can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`revision/e1a315fa3fa734e2a6154ed7b5b9ae0eb8987aad/log/` """ # noqa result = {} per_page = int(request.query_params.get('per_page', '10')) def lookup_revision_log_with_limit(s, limit=per_page+1): return service.lookup_revision_log(s, limit) error_msg = 'Revision with sha1_git %s not found.' % sha1_git rev_get = api_lookup(lookup_revision_log_with_limit, sha1_git, notfound_msg=error_msg, enrich_fn=utils.enrich_revision) nb_rev = len(rev_get) if nb_rev == per_page+1: rev_backward = rev_get[:-1] new_last_sha1 = rev_get[-1]['id'] query_params = {} if request.query_params.get('per_page'): query_params['per_page'] = per_page result['headers'] = { 'link-next': reverse('api-revision-log', url_args={'sha1_git': new_last_sha1}, query_params=query_params) } else: rev_backward = rev_get if not prev_sha1s: # no nav breadcrumbs, so we're done revisions = rev_backward else: rev_forward_ids = prev_sha1s.split('/') rev_forward = api_lookup( service.lookup_revision_multiple, rev_forward_ids, notfound_msg=error_msg, enrich_fn=utils.enrich_revision) revisions = rev_forward + rev_backward result.update({ 'results': revisions }) return result diff --git a/swh/web/api/views/snapshot.py b/swh/web/api/views/snapshot.py index 0fa3f074..43d56197 100644 --- a/swh/web/api/views/snapshot.py +++ b/swh/web/api/views/snapshot.py @@ -1,107 +1,107 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common import service from swh.web.common.utils import reverse from swh.web.config import get_config from swh.web.api.apidoc import api_doc from swh.web.api import utils from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup @api_route(r'/snapshot/(?P[0-9a-f]+)/', 'api-snapshot') @api_doc('/snapshot/') def api_snapshot(request, snapshot_id): """ .. http:get:: /api/1/snapshot/(snapshot_id)/ - Get information about a snapshot in the SWH archive. + Get information about a snapshot in the archive. A snapshot is a set of named branches, which are pointers to objects at any level of the Software Heritage DAG. It represents a full picture of an origin at a given time. As well as pointing to other objects in the Software Heritage DAG, branches can also be aliases, in which case their target is the name of another branch in the same snapshot, or dangling, in which case the target is unknown. A snapshot identifier is a salted sha1. See :func:`swh.model.identifiers.snapshot_identifier` in our data model module for details about how they are computed. - :param sha1 snapshot_id: a SWH snapshot identifier + :param sha1 snapshot_id: a snapshot identifier :query str branches_from: optional parameter used to skip branches whose name is lesser than it before returning them :query int branches_count: optional parameter used to restrain the amount of returned branches (default to 1000) :query str target_types: optional comma separated list parameter used to filter the target types of branch to return (possible values - that can be contained in that list are `'content', 'directory', - 'revision', 'release', 'snapshot', 'alias'`) + that can be contained in that list are ``content``, ``directory``, + ``revision``, ``release``, ``snapshot`` or ``alias``) :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :resheader Link: indicates that a subsequent result page is available and contains the url pointing to it :>json object branches: object containing all branches associated to the snapshot, - for each of them the associated SWH target type and id are given but also + for each of them the associated target type and id are given but also a link to get information about that target :>json string id: the unique identifier of the snapshot **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid snapshot identifier has been provided - :statuscode 404: requested snapshot can not be found in the SWH archive + :statuscode 404: requested snapshot can not be found in the archive **Example:** .. parsed-literal:: :swh_web_api:`snapshot/6a3a2cf0b2b90ce7ae1cf0a221ed68035b686f5a/` """ # noqa def _enrich_snapshot(snapshot): s = snapshot.copy() if 'branches' in s: s['branches'] = { k: utils.enrich_object(v) if v else None for k, v in s['branches'].items() } return s snapshot_content_max_size = get_config()['snapshot_content_max_size'] branches_from = request.GET.get('branches_from', '') branches_count = int(request.GET.get('branches_count', snapshot_content_max_size)) target_types = request.GET.get('target_types', None) target_types = target_types.split(',') if target_types else None results = api_lookup( service.lookup_snapshot, snapshot_id, branches_from, branches_count+1, target_types, notfound_msg='Snapshot with id {} not found.'.format(snapshot_id), enrich_fn=_enrich_snapshot) next_branch = None if len(results['branches']) > branches_count: next_branch = sorted(results['branches'].keys())[-1] del results['branches'][next_branch] response = {'results': results, 'headers': {}} if next_branch: response['headers']['link-next'] = \ reverse('api-snapshot', url_args={'snapshot_id': snapshot_id}, query_params={'branches_from': next_branch, 'branches_count': branches_count, 'target_types': target_types}) return response diff --git a/swh/web/api/views/stat.py b/swh/web/api/views/stat.py index 019d1d3a..e8a3f9c8 100644 --- a/swh/web/api/views/stat.py +++ b/swh/web/api/views/stat.py @@ -1,53 +1,53 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common import service from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route @api_route(r'/stat/counters/', 'api-stat-counters') @api_doc('/stat/counters/', noargs=True) def api_stats(request): """ .. http:get:: /api/1/stat/counters/ Get statistics about the content of the archive. - :>json number content: current number of content objects (aka files) in the SWH archive - :>json number directory: current number of directory objects in the SWH archive - :>json number directory_entry_dir: current number of SWH directory entries - pointing to others SWH directories in the SWH archive - :>json number directory_entry_file: current number of SWH directory entries - pointing to SWH content objects in the SWH archive - :>json number directory_entry_rev: current number of SWH directory entries - pointing to SWH revision objects (e.g. git submodules) in the SWH archive - :>json number entity: current number of SWH entities (a SWH entity is either - a *group_of_entities*, a *group_of_persons*, a *project*, a *person*, an *organization*, - or a *hosting* service) in the SWH archive - :>json number origin: current number of SWH origins (an origin is a "place" where code - source can be found, e.g. a git repository, a tarball, ...) in the SWH archive - :>json number person: current number of SWH persons (code source authors or committers) - in the SWH archive - :>json number release: current number of SWH releases objects in the SWH archive - :>json number revision: current number of SWH revision objects (aka commits) in the SWH archive + :>json number content: current number of content objects (aka files) in the archive + :>json number directory: current number of directory objects in the archive + :>json number directory_entry_dir: current number of directory entries + pointing to others directories in the archive + :>json number directory_entry_file: current number of directory entries + pointing to content objects in the archive + :>json number directory_entry_rev: current number of directory entries + pointing to revision objects (e.g. git submodules) in the archive + :>json number entity: current number of entities (an entity is either + a **group_of_entities**, a **group_of_persons**, a **project**, a **person**, an **organization**, + or a **hosting** service) in the archive + :>json number origin: current number of software origins (an origin is a "place" where code + source can be found, e.g. a git repository, a tarball, ...) in the archive + :>json number person: current number of persons (code source authors or committers) + in the archive + :>json number release: current number of releases objects in the archive + :>json number revision: current number of revision objects (aka commits) in the archive :>json number skipped_content: current number of content objects (aka files) which where - not inserted in the SWH archive + not inserted in the archive :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error **Example:** .. parsed-literal:: :swh_web_api:`stat/counters/` """ # noqa return service.stat_counters() diff --git a/swh/web/api/views/vault.py b/swh/web/api/views/vault.py index 207b6386..e5e3803a 100644 --- a/swh/web/api/views/vault.py +++ b/swh/web/api/views/vault.py @@ -1,203 +1,203 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.http import HttpResponse from django.views.decorators.cache import never_cache from swh.model import hashutil from swh.web.common import service, query from swh.web.common.utils import reverse from swh.web.api.apidoc import api_doc from swh.web.api.apiurls import api_route from swh.web.api.views.utils import api_lookup # XXX: a bit spaghetti. Would be better with class-based views. def _dispatch_cook_progress(request, obj_type, obj_id): hex_id = hashutil.hash_to_hex(obj_id) object_name = obj_type.split('_')[0].title() if request.method == 'GET': return api_lookup( service.vault_progress, obj_type, obj_id, notfound_msg=("{} '{}' was never requested." .format(object_name, hex_id))) elif request.method == 'POST': email = request.POST.get('email', request.GET.get('email', None)) return api_lookup( service.vault_cook, obj_type, obj_id, email, notfound_msg=("{} '{}' not found." .format(object_name, hex_id))) @api_route(r'/vault/directory/(?P[a-fA-F0-9]+)/', 'api-vault-cook-directory', methods=['GET', 'POST'], throttle_scope='swh_vault_cooking') @never_cache @api_doc('/vault/directory/', tags=['hidden']) def api_vault_cook_directory(request, dir_id): """ .. http:get:: /api/1/vault/directory/(dir_id)/ .. http:post:: /api/1/vault/directory/(dir_id)/ Request the cooking of an archive for a directory or check its cooking status. That endpoint enables to create a vault cooking task for a directory through a POST request or check the status of a previously created one through a GET request. To import the directory in the current directory, use:: $ tar xvf path/to/directory.tar.gz :param string dir_id: the directory's sha1 identifier :query string email: e-mail to notify when the archive is ready :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json string fetch_url: the url from which to download the archive once it has been cooked (see :http:get:`/api/1/vault/directory/(dir_id)/raw/`) :>json string obj_type: the type of object to cook (directory or revision) :>json string progress_message: message describing the cooking task progress :>json number id: the cooking task id :>json string status: the cooking task status (new/pending/done/failed) :>json string obj_id: the identifier of the object to cook **Allowed HTTP Methods:** :http:method:`get`, :http:method:`post`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid directory identifier has been provided - :statuscode 404: requested directory can not be found in the SWH archive + :statuscode 404: requested directory can not be found in the archive """ # noqa _, obj_id = query.parse_hash_with_algorithms_or_throws( dir_id, ['sha1'], 'Only sha1_git is supported.') res = _dispatch_cook_progress(request, 'directory', obj_id) res['fetch_url'] = reverse('api-vault-fetch-directory', url_args={'dir_id': dir_id}) return res @api_route(r'/vault/directory/(?P[a-fA-F0-9]+)/raw/', 'api-vault-fetch-directory') @api_doc('/vault/directory/raw/', tags=['hidden'], handle_response=True) def api_vault_fetch_directory(request, dir_id): """ .. http:get:: /api/1/vault/directory/(dir_id)/raw/ Fetch the cooked archive for a directory. See :http:get:`/api/1/vault/directory/(dir_id)/` to get more details on directory cooking. :param string dir_id: the directory's sha1 identifier :resheader Content-Type: application/octet-stream **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid directory identifier has been provided - :statuscode 404: requested directory can not be found in the SWH archive + :statuscode 404: requested directory can not be found in the archive """ # noqa _, obj_id = query.parse_hash_with_algorithms_or_throws( dir_id, ['sha1'], 'Only sha1_git is supported.') res = api_lookup( service.vault_fetch, 'directory', obj_id, notfound_msg="Directory with ID '{}' not found.".format(dir_id)) fname = '{}.tar.gz'.format(dir_id) response = HttpResponse(res, content_type='application/gzip') response['Content-disposition'] = 'attachment; filename={}'.format(fname) return response @api_route(r'/vault/revision/(?P[a-fA-F0-9]+)/gitfast/', 'api-vault-cook-revision_gitfast', methods=['GET', 'POST'], throttle_scope='swh_vault_cooking') @never_cache @api_doc('/vault/revision/gitfast/', tags=['hidden']) def api_vault_cook_revision_gitfast(request, rev_id): """ .. http:get:: /api/1/vault/revision/(rev_id)/gitfast/ .. http:post:: /api/1/vault/revision/(rev_id)/gitfast/ Request the cooking of a gitfast archive for a revision or check its cooking status. That endpoint enables to create a vault cooking task for a revision through a POST request or check the status of a previously created one through a GET request. To import the revision in the current directory, use:: $ git init $ zcat path/to/revision.gitfast.gz | git fast-import $ git checkout HEAD :param string rev_id: the revision's sha1 identifier :query string email: e-mail to notify when the gitfast archive is ready :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json string fetch_url: the url from which to download the archive once it has been cooked (see :http:get:`/api/1/vault/revision/(rev_id)/gitfast/raw/`) :>json string obj_type: the type of object to cook (directory or revision) :>json string progress_message: message describing the cooking task progress :>json number id: the cooking task id :>json string status: the cooking task status (new/pending/done/failed) :>json string obj_id: the identifier of the object to cook **Allowed HTTP Methods:** :http:method:`get`, :http:method:`post`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid revision identifier has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 404: requested revision can not be found in the archive """ # noqa _, obj_id = query.parse_hash_with_algorithms_or_throws( rev_id, ['sha1'], 'Only sha1_git is supported.') res = _dispatch_cook_progress(request, 'revision_gitfast', obj_id) res['fetch_url'] = reverse('api-vault-fetch-revision_gitfast', url_args={'rev_id': rev_id}) return res @api_route(r'/vault/revision/(?P[a-fA-F0-9]+)/gitfast/raw/', 'api-vault-fetch-revision_gitfast') @api_doc('/vault/revision/gitfast/raw/', tags=['hidden'], handle_response=True) def api_vault_fetch_revision_gitfast(request, rev_id): """ .. http:get:: /api/1/vault/revision/(rev_id)/gitfast/raw/ Fetch the cooked gitfast archive for a revision. See :http:get:`/api/1/vault/revision/(rev_id)/gitfast/` to get more details on directory cooking. :param string rev_id: the revision's sha1 identifier :resheader Content-Type: application/octet-stream **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error :statuscode 400: an invalid revision identifier has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 404: requested revision can not be found in the archive """ # noqa _, obj_id = query.parse_hash_with_algorithms_or_throws( rev_id, ['sha1'], 'Only sha1_git is supported.') res = api_lookup( service.vault_fetch, 'revision_gitfast', obj_id, notfound_msg="Revision with ID '{}' not found.".format(rev_id)) fname = '{}.gitfast.gz'.format(rev_id) response = HttpResponse(res, content_type='application/gzip') response['Content-disposition'] = 'attachment; filename={}'.format(fname) return response diff --git a/swh/web/assets/src/bundles/origin/visits-histogram.js b/swh/web/assets/src/bundles/origin/visits-histogram.js index 5c59b92c..f0613810 100644 --- a/swh/web/assets/src/bundles/origin/visits-histogram.js +++ b/swh/web/assets/src/bundles/origin/visits-histogram.js @@ -1,337 +1,337 @@ /** * Copyright (C) 2018 The Software Heritage developers * See the AUTHORS file at the top-level directory of this distribution * License: GNU Affero General Public License version 3, or any later version * See top-level LICENSE file for more information */ -// Creation of a stacked histogram with D3.js for SWH origin visits history +// Creation of a stacked histogram with D3.js for software origin visits history // Parameters description: // - container: selector for the div that will contain the histogram // - visitsData: raw swh origin visits data // - currentYear: the visits year to display by default // - yearClickCallback: callback when the user selects a year through the histogram import * as d3 from 'd3'; export function createVisitsHistogram(container, visitsData, currentYear, yearClickCallback) { // remove previously created histogram and tooltip if any d3.select(container).select('svg').remove(); d3.select('div.d3-tooltip').remove(); // histogram size and margins let width = 1000; let height = 300; let margin = {top: 20, right: 80, bottom: 30, left: 50}; // create responsive svg let svg = d3.select(container) .attr('style', 'padding-bottom: ' + Math.ceil(height * 100 / width) + '%') .append('svg') .attr('viewBox', '0 0 ' + width + ' ' + height); // create tooltip div let tooltip = d3.select('body') .append('div') .attr('class', 'd3-tooltip') .style('opacity', 0); // update width and height without margins width = width - margin.left - margin.right; height = height - margin.top - margin.bottom; // create main svg group element let g = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); // create x scale let x = d3.scaleTime().rangeRound([0, width]); // create y scale let y = d3.scaleLinear().range([height, 0]); // create ordinal colorscale mapping visit status let colors = d3.scaleOrdinal() .domain(['full', 'partial', 'failed', 'ongoing']) .range(['#008000', '#edc344', '#ff0000', '#0000ff']); - // first SWH crawls were made in 2015 + // first swh crawls were made in 2015 let startYear = 2015; // set latest display year as the current one let now = new Date(); let endYear = now.getUTCFullYear() + 1; let monthExtent = [new Date(Date.UTC(startYear, 0, 1)), new Date(Date.UTC(endYear, 0, 1))]; // create months bins based on setup extent let monthBins = d3.timeMonths(d3.timeMonth.offset(monthExtent[0], -1), monthExtent[1]); // create years bins based on setup extent let yearBins = d3.timeYears(monthExtent[0], monthExtent[1]); // set x scale domain x.domain(d3.extent(monthBins)); // use D3 histogram layout to create a function that will bin the visits by month let binByMonth = d3.histogram() .value(d => d.date) .domain(x.domain()) .thresholds(monthBins); // use D3 nest function to group the visits by status let visitsByStatus = d3.nest() .key(d => d['status']) .sortKeys(d3.ascending) .entries(visitsData); // prepare data in order to be able to stack visit statuses by month let statuses = []; let histData = []; for (let i = 0; i < monthBins.length; ++i) { histData[i] = {}; } visitsByStatus.forEach(entry => { statuses.push(entry.key); let monthsData = binByMonth(entry.values); for (let i = 0; i < monthsData.length; ++i) { histData[i]['x0'] = monthsData[i]['x0']; histData[i]['x1'] = monthsData[i]['x1']; histData[i][entry.key] = monthsData[i]; } }); // create function to stack visits statuses by month let stacked = d3.stack() .keys(statuses) .value((d, key) => d[key].length); // compute the maximum amount of visits by month let yMax = d3.max(histData, d => { let total = 0; for (let i = 0; i < statuses.length; ++i) { total += d[statuses[i]].length; } return total; }); // set y scale domain y.domain([0, yMax]); // compute ticks values for the y axis let step = 5; let yTickValues = []; for (let i = 0; i <= yMax / step; ++i) { yTickValues.push(i * step); } if (yTickValues.length === 0) { for (let i = 0; i <= yMax; ++i) { yTickValues.push(i); } } else if (yMax % step !== 0) { yTickValues.push(yMax); } // add histogram background grid g.append('g') .attr('class', 'grid') .call(d3.axisLeft(y) .tickValues(yTickValues) .tickSize(-width) .tickFormat('')); // create one fill only rectangle by displayed year // each rectangle will be made visible when hovering the mouse over a year range // user will then be able to select a year by clicking in the rectangle g.append('g') .selectAll('rect') .data(yearBins) .enter().append('rect') .attr('class', d => 'year' + d.getUTCFullYear()) .attr('fill', 'red') .attr('fill-opacity', d => d.getUTCFullYear() === currentYear ? 0.3 : 0) .attr('stroke', 'none') .attr('x', d => { let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return x(date); }) .attr('y', 0) .attr('height', height) .attr('width', d => { let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date); return yearWidth; }) // mouse event callbacks used to show rectangle years // when hovering the mouse over the histograms .on('mouseover', d => { svg.selectAll('rect.year' + d.getUTCFullYear()) .attr('fill-opacity', 0.5); }) .on('mouseout', d => { svg.selectAll('rect.year' + d.getUTCFullYear()) .attr('fill-opacity', 0); svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0.3); }) // callback to select a year after a mouse click // in a rectangle year .on('click', d => { svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0); svg.selectAll('rect.yearoutline' + currentYear) .attr('stroke', 'none'); currentYear = d.getUTCFullYear(); svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0.5); svg.selectAll('rect.yearoutline' + currentYear) .attr('stroke', 'black'); yearClickCallback(currentYear); }); // create the stacked histogram of visits g.append('g') .selectAll('g') .data(stacked(histData)) .enter().append('g') .attr('fill', d => colors(d.key)) .selectAll('rect') .data(d => d) .enter().append('rect') .attr('class', d => 'month' + d.data.x1.getMonth()) .attr('x', d => x(d.data.x0)) .attr('y', d => y(d[1])) .attr('height', d => y(d[0]) - y(d[1])) .attr('width', d => x(d.data.x1) - x(d.data.x0) - 1) // mouse event callbacks used to show rectangle years // but also to show tooltip when hovering the mouse // over the histogram bars .on('mouseover', d => { svg.selectAll('rect.year' + d.data.x1.getUTCFullYear()) .attr('fill-opacity', 0.5); tooltip.transition() .duration(200) .style('opacity', 1); let ds = d.data.x1.toISOString().substr(0, 7).split('-'); let tooltipText = '' + ds[1] + ' / ' + ds[0] + ':
'; for (let i = 0; i < statuses.length; ++i) { let visitStatus = statuses[i]; let nbVisits = d.data[visitStatus].length; if (nbVisits === 0) continue; tooltipText += nbVisits + ' ' + visitStatus + ' visits'; if (i !== statuses.length - 1) tooltipText += '
'; } tooltip.html(tooltipText) .style('left', d3.event.pageX + 15 + 'px') .style('top', d3.event.pageY + 'px'); }) .on('mouseout', d => { svg.selectAll('rect.year' + d.data.x1.getUTCFullYear()) .attr('fill-opacity', 0); svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0.3); tooltip.transition() .duration(500) .style('opacity', 0); }) .on('mousemove', () => { tooltip.style('left', d3.event.pageX + 15 + 'px') .style('top', d3.event.pageY + 'px'); }) // callback to select a year after a mouse click // inside a histogram bar .on('click', d => { svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0); svg.selectAll('rect.yearoutline' + currentYear) .attr('stroke', 'none'); currentYear = d.data.x1.getUTCFullYear(); svg.selectAll('rect.year' + currentYear) .attr('fill-opacity', 0.5); svg.selectAll('rect.yearoutline' + currentYear) .attr('stroke', 'black'); yearClickCallback(currentYear); }); // create one stroke only rectangle by displayed year // that will be displayed on top of the histogram when the user has selected a year g.append('g') .selectAll('rect') .data(yearBins) .enter().append('rect') .attr('class', d => 'yearoutline' + d.getUTCFullYear()) .attr('fill', 'none') .attr('stroke', d => d.getUTCFullYear() === currentYear ? 'black' : 'none') .attr('x', d => { let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return x(date); }) .attr('y', 0) .attr('height', height) .attr('width', d => { let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date); return yearWidth; }); // add x axis with a tick for every 1st day of each year let xAxis = g.append('g') .attr('class', 'axis') .attr('transform', 'translate(0,' + height + ')') .call( d3.axisBottom(x) .ticks(d3.timeYear.every(1)) .tickFormat(d => d.getUTCFullYear()) ); // shift tick labels in order to display them at the middle // of each year range xAxis.selectAll('text') .attr('transform', d => { let year = d.getUTCFullYear(); let date = new Date(Date.UTC(year, 0, 1)); let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date); return 'translate(' + -yearWidth / 2 + ', 0)'; }); // add y axis for the number of visits g.append('g') .attr('class', 'axis') .call(d3.axisLeft(y).tickValues(yTickValues)); // add legend for visit statuses let legendGroup = g.append('g') .attr('font-family', 'sans-serif') .attr('font-size', 10) .attr('text-anchor', 'end'); legendGroup.append('text') .attr('x', width + margin.right - 5) .attr('y', 9.5) .attr('dy', '0.32em') .text('visit status:'); let legend = legendGroup.selectAll('g') .data(statuses.slice().reverse()) .enter().append('g') .attr('transform', (d, i) => 'translate(0,' + (i + 1) * 20 + ')'); legend.append('rect') .attr('x', width + 2 * margin.right / 3) .attr('width', 19) .attr('height', 19) .attr('fill', colors); legend.append('text') .attr('x', width + 2 * margin.right / 3 - 5) .attr('y', 9.5) .attr('dy', '0.32em') .text(d => d); // add text label for the y axis g.append('text') .attr('transform', 'rotate(-90)') .attr('y', -margin.left) .attr('x', -(height / 2)) .attr('dy', '1em') .style('text-anchor', 'middle') .text('Number of visits'); } diff --git a/swh/web/browse/browseurls.py b/swh/web/browse/browseurls.py index c5968158..d1d4547b 100644 --- a/swh/web/browse/browseurls.py +++ b/swh/web/browse/browseurls.py @@ -1,38 +1,38 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.common.urlsindex import UrlsIndex class BrowseUrls(UrlsIndex): """ - Class to manage SWH web browse application urls. + Class to manage swh-web browse application urls. """ scope = 'browse' class browse_route(object): # noqa: N801 """ - Decorator to ease the registration of a SWH web browse endpoint + Decorator to ease the registration of a swh-web browse endpoint Args: url_patterns: list of url patterns used by Django to identify the browse routes view_name: the name of the Django view associated to the routes used to reverse the url """ # noqa def __init__(self, *url_patterns, view_name=None): super().__init__() self.url_patterns = [] for url_pattern in url_patterns: self.url_patterns.append('^' + url_pattern + '$') self.view_name = view_name def __call__(self, f): # register the route and its view in the browse endpoints index for url_pattern in self.url_patterns: BrowseUrls.add_url_pattern(url_pattern, f, self.view_name) return f diff --git a/swh/web/browse/identifiers.py b/swh/web/browse/identifiers.py index 22fd98b1..c7d82285 100644 --- a/swh/web/browse/identifiers.py +++ b/swh/web/browse/identifiers.py @@ -1,25 +1,25 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.shortcuts import redirect from swh.web.common.utils import resolve_swh_persistent_id from swh.web.common.exc import handle_view_exception def swh_id_browse(request, swh_id): """ - Django view enabling to browse the SWH archive using + Django view enabling to browse the archive using :ref:`persistent-identifiers`. The url that points to it is :http:get:`/(swh_id)/`. """ try: swh_id_resolved = resolve_swh_persistent_id( swh_id, query_params=request.GET) except Exception as exc: return handle_view_exception(request, exc) return redirect(swh_id_resolved['browse_url']) diff --git a/swh/web/browse/utils.py b/swh/web/browse/utils.py index ef0a1ee9..604d4ea9 100644 --- a/swh/web/browse/utils.py +++ b/swh/web/browse/utils.py @@ -1,1173 +1,1173 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import base64 from collections import defaultdict import magic import math import pypandoc import stat import textwrap from django.core.cache import cache from django.utils.safestring import mark_safe from importlib import reload from swh.model.identifiers import persistent_identifier from swh.web.common import highlightjs, service from swh.web.common.exc import NotFoundExc, http_status_code_message from swh.web.common.utils import ( reverse, format_utc_iso_date, parse_timestamp, get_origin_visits, get_swh_persistent_id, swh_object_icons ) from swh.web.config import get_config def get_directory_entries(sha1_git): - """Function that retrieves the content of a SWH directory - from the SWH archive. + """Function that retrieves the content of a directory + from the archive. The directories entries are first sorted in lexicographical order. Sub-directories and regular files are then extracted. Args: sha1_git: sha1_git identifier of the directory Returns: A tuple whose first member corresponds to the sub-directories list and second member the regular files list Raises: NotFoundExc if the directory is not found """ cache_entry_id = 'directory_entries_%s' % sha1_git cache_entry = cache.get(cache_entry_id) if cache_entry: return cache_entry entries = list(service.lookup_directory(sha1_git)) for e in entries: e['perms'] = stat.filemode(e['perms']) if e['type'] == 'rev': # modify dir entry name to explicitly show it points # to a revision e['name'] = '%s @ %s' % (e['name'], e['target'][:7]) dirs = [e for e in entries if e['type'] in ('dir', 'rev')] files = [e for e in entries if e['type'] == 'file'] dirs = sorted(dirs, key=lambda d: d['name']) files = sorted(files, key=lambda f: f['name']) cache.set(cache_entry_id, (dirs, files)) return dirs, files def get_mimetype_and_encoding_for_content(content): """Function that returns the mime type and the encoding associated to a content buffer using the magic module under the hood. Args: content (bytes): a content buffer Returns: A tuple (mimetype, encoding), for instance ('text/plain', 'us-ascii'), associated to the provided content. """ while True: try: magic_result = magic.detect_from_content(content) mime_type = magic_result.mime_type encoding = magic_result.encoding break except Exception: # workaround an issue with the magic module who can fail # if detect_from_content is called multiple times in # a short amount of time reload(magic) return mime_type, encoding # maximum authorized content size in bytes for HTML display # with code highlighting content_display_max_size = get_config()['content_display_max_size'] snapshot_content_max_size = get_config()['snapshot_content_max_size'] def request_content(query_string, max_size=content_display_max_size, raise_if_unavailable=True, reencode=True): - """Function that retrieves a SWH content from the SWH archive. + """Function that retrieves a content from the archive. Raw bytes content is first retrieved, then the content mime type. If the mime type is not stored in the archive, it will be computed using Python magic module. Args: query_string: a string of the form "[ALGO_HASH:]HASH" where - optional ALGO_HASH can be either *sha1*, *sha1_git*, *sha256*, - or *blake2s256* (default to *sha1*) and HASH the hexadecimal - representation of the hash value + optional ALGO_HASH can be either ``sha1``, ``sha1_git``, + ``sha256``, or ``blake2s256`` (default to ``sha1``) and HASH + the hexadecimal representation of the hash value max_size: the maximum size for a content to retrieve (default to 1MB, no size limit if None) Returns: A tuple whose first member corresponds to the content raw bytes and second member the content mime type Raises: NotFoundExc if the content is not found """ content_data = service.lookup_content(query_string) filetype = None language = None license = None # requests to the indexer db may fail so properly handle # those cases in order to avoid content display errors try: filetype = service.lookup_content_filetype(query_string) language = service.lookup_content_language(query_string) license = service.lookup_content_license(query_string) except Exception: pass mimetype = 'unknown' encoding = 'unknown' if filetype: mimetype = filetype['mimetype'] encoding = filetype['encoding'] content_data['error_code'] = 200 content_data['error_message'] = '' content_data['error_description'] = '' if not max_size or content_data['length'] < max_size: try: content_raw = service.lookup_content_raw(query_string) except Exception as e: if raise_if_unavailable: raise e else: content_data['raw_data'] = None content_data['error_code'] = 404 content_data['error_description'] = \ 'The bytes of the content are currently not available in the archive.' # noqa content_data['error_message'] = \ http_status_code_message[content_data['error_code']] else: content_data['raw_data'] = content_raw['data'] if not filetype: mimetype, encoding = \ get_mimetype_and_encoding_for_content(content_data['raw_data']) # noqa # encode textual content to utf-8 if needed if reencode and mimetype.startswith('text/'): # probably a malformed UTF-8 content, re-encode it # by replacing invalid chars with a substitution one if encoding == 'unknown-8bit': content_data['raw_data'] = \ content_data['raw_data'].decode('utf-8', 'replace')\ .encode('utf-8') elif 'ascii' not in encoding and encoding not in ['utf-8', 'binary']: # noqa content_data['raw_data'] = \ content_data['raw_data'].decode(encoding, 'replace')\ .encode('utf-8') elif reencode and mimetype.startswith('application/octet-stream'): # file may detect a text content as binary # so try to decode it for display encodings = ['us-ascii'] encodings += ['iso-8859-%s' % i for i in range(1, 17)] for encoding in encodings: try: content_data['raw_data'] = \ content_data['raw_data'].decode(encoding)\ .encode('utf-8') except Exception: pass else: # ensure display in content view mimetype = 'text/plain' break else: content_data['raw_data'] = None content_data['mimetype'] = mimetype content_data['encoding'] = encoding if language: content_data['language'] = language['lang'] else: content_data['language'] = 'not detected' if license: content_data['licenses'] = ', '.join(license['facts'][0]['licenses']) else: content_data['licenses'] = 'not detected' return content_data _browsers_supported_image_mimes = set(['image/gif', 'image/png', 'image/jpeg', 'image/bmp', 'image/webp', 'image/svg', 'image/svg+xml']) def prepare_content_for_display(content_data, mime_type, path): """Function that prepares a content for HTML display. The function tries to associate a programming language to a content in order to perform syntax highlighting client-side using highlightjs. The language is determined using either the content filename or its mime type. If the mime type corresponds to an image format supported by web browsers, the content will be encoded in base64 for displaying the image. Args: content_data (bytes): raw bytes of the content mime_type (string): mime type of the content path (string): path of the content including filename Returns: A dict containing the content bytes (possibly different from the one provided as parameter if it is an image) under the key 'content_data and the corresponding highlightjs language class under the key 'language'. """ language = highlightjs.get_hljs_language_from_filename(path) if not language: language = highlightjs.get_hljs_language_from_mime_type(mime_type) if not language: language = 'nohighlight' elif mime_type.startswith('application/'): mime_type = mime_type.replace('application/', 'text/') if mime_type.startswith('image/'): if mime_type in _browsers_supported_image_mimes: content_data = base64.b64encode(content_data) else: content_data = None if mime_type.startswith('image/svg'): mime_type = 'image/svg+xml' return {'content_data': content_data, 'language': language, 'mimetype': mime_type} def get_origin_visit(origin_info, visit_ts=None, visit_id=None, snapshot_id=None): - """Function that returns information about a SWH visit for + """Function that returns information about a visit for a given origin. The visit is retrieved from a provided timestamp. The closest visit from that timestamp is selected. Args: origin_info (dict): a dict filled with origin information (id, url, type) visit_ts (int or str): an ISO date string or Unix timestamp to parse Returns: A dict containing the visit info as described below:: {'origin': 2, 'date': '2017-10-08T11:54:25.582463+00:00', 'metadata': {}, 'visit': 25, 'status': 'full'} """ visits = get_origin_visits(origin_info) if not visits: - raise NotFoundExc('No SWH visit associated to origin with' + raise NotFoundExc('No visit associated to origin with' ' type %s and url %s!' % (origin_info['type'], origin_info['url'])) if snapshot_id: visit = [v for v in visits if v['snapshot'] == snapshot_id] if len(visit) == 0: raise NotFoundExc( 'Visit for snapshot with id %s for origin with type %s' ' and url %s not found!' % (snapshot_id, origin_info['type'], origin_info['url'])) return visit[0] if visit_id: visit = [v for v in visits if v['visit'] == int(visit_id)] if len(visit) == 0: raise NotFoundExc( 'Visit with id %s for origin with type %s' ' and url %s not found!' % (visit_id, origin_info['type'], origin_info['url'])) return visit[0] if not visit_ts: # returns the latest full visit when no timestamp is provided for v in reversed(visits): if v['status'] == 'full': return v return visits[-1] parsed_visit_ts = math.floor(parse_timestamp(visit_ts).timestamp()) visit_idx = None for i, visit in enumerate(visits): ts = math.floor(parse_timestamp(visit['date']).timestamp()) if i == 0 and parsed_visit_ts <= ts: return visit elif i == len(visits) - 1: if parsed_visit_ts >= ts: return visit else: next_ts = math.floor( parse_timestamp(visits[i+1]['date']).timestamp()) if parsed_visit_ts >= ts and parsed_visit_ts < next_ts: if (parsed_visit_ts - ts) < (next_ts - parsed_visit_ts): visit_idx = i break else: visit_idx = i+1 break if visit_idx is not None: visit = visits[visit_idx] while visit_idx < len(visits) - 1 and \ visit['date'] == visits[visit_idx+1]['date']: visit_idx = visit_idx + 1 visit = visits[visit_idx] return visit else: raise NotFoundExc( 'Visit with timestamp %s for origin with type %s and url %s not found!' % # noqa (visit_ts, origin_info['type'], origin_info['url'])) def process_snapshot_branches(snapshot_branches): """ Process a dictionary describing snapshot branches: extract those targeting revisions and releases, put them in two different lists, then sort those lists in lexicographical order of the branches' names. Args: snapshot_branches (dict): A dict describing the branches of a snapshot as returned for instance by :func:`swh.web.common.service.lookup_snapshot` Returns: tuple: A tuple whose first member is the sorted list of branches targeting revisions and second member the sorted list of branches targeting releases """ # noqa branches = {} releases = {} revision_to_branch = defaultdict(set) revision_to_release = defaultdict(set) release_to_branch = defaultdict(set) for branch_name, target in snapshot_branches.items(): if not target: # FIXME: display branches with an unknown target anyway continue target_id = target['target'] target_type = target['target_type'] if target_type == 'revision': branches[branch_name] = { 'name': branch_name, 'revision': target_id, } revision_to_branch[target_id].add(branch_name) elif target_type == 'release': release_to_branch[target_id].add(branch_name) # FIXME: handle pointers to other object types # FIXME: handle branch aliases releases_info = service.lookup_release_multiple( release_to_branch.keys() ) for release in releases_info: branches_to_update = release_to_branch[release['id']] for branch in branches_to_update: releases[branch] = { 'name': release['name'], 'branch_name': branch, 'date': format_utc_iso_date(release['date']), 'id': release['id'], 'message': release['message'], 'target_type': release['target_type'], 'target': release['target'], } if release['target_type'] == 'revision': revision_to_release[release['target']].update( branches_to_update ) revisions = service.lookup_revision_multiple( set(revision_to_branch.keys()) | set(revision_to_release.keys()) ) for revision in revisions: if not revision: continue revision_data = { 'directory': revision['directory'], 'date': format_utc_iso_date(revision['date']), 'message': revision['message'], } for branch in revision_to_branch[revision['id']]: branches[branch].update(revision_data) for release in revision_to_release[revision['id']]: releases[release]['directory'] = revision['directory'] ret_branches = list(sorted(branches.values(), key=lambda b: b['name'])) ret_releases = list(sorted(releases.values(), key=lambda b: b['name'])) return ret_branches, ret_releases def get_snapshot_content(snapshot_id): """Returns the lists of branches and releases associated to a swh snapshot. That list is put in cache in order to speedup the navigation in the swh-web/browse ui. .. warning:: At most 1000 branches contained in the snapshot will be returned for performance reasons. Args: snapshot_id (str): hexadecimal representation of the snapshot identifier Returns: A tuple with two members. The first one is a list of dict describing the snapshot branches. The second one is a list of dict describing the snapshot releases. Raises: NotFoundExc if the snapshot does not exist """ cache_entry_id = 'swh_snapshot_%s' % snapshot_id cache_entry = cache.get(cache_entry_id) if cache_entry: return cache_entry['branches'], cache_entry['releases'] branches = [] releases = [] if snapshot_id: snapshot = service.lookup_snapshot( snapshot_id, branches_count=snapshot_content_max_size) branches, releases = process_snapshot_branches(snapshot['branches']) cache.set(cache_entry_id, { 'branches': branches, 'releases': releases, }) return branches, releases def get_origin_visit_snapshot(origin_info, visit_ts=None, visit_id=None, snapshot_id=None): """Returns the lists of branches and releases associated to a swh origin for a given visit. The visit is expressed by a timestamp. In the latter case, the closest visit from the provided timestamp will be used. If no visit parameter is provided, it returns the list of branches found for the latest visit. That list is put in cache in order to speedup the navigation in the swh-web/browse ui. .. warning:: At most 1000 branches contained in the snapshot will be returned for performance reasons. Args: origin_info (dict): a dict filled with origin information (id, url, type) visit_ts (int or str): an ISO date string or Unix timestamp to parse visit_id (int): optional visit id for disambiguation in case several visits have the same timestamp Returns: A tuple with two members. The first one is a list of dict describing the origin branches for the given visit. The second one is a list of dict describing the origin releases for the given visit. Raises: NotFoundExc if the origin or its visit are not found """ visit_info = get_origin_visit(origin_info, visit_ts, visit_id, snapshot_id) return get_snapshot_content(visit_info['snapshot']) def gen_link(url, link_text=None, link_attrs={}): """ Utility function for generating an HTML link to insert in Django templates. Args: url (str): an url link_text (str): optional text for the produced link, if not provided the url will be used link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'link_text' """ attrs = ' ' for k, v in link_attrs.items(): attrs += '%s="%s" ' % (k, v) if not link_text: link_text = url link = '%s' % (attrs, url, link_text) return mark_safe(link) def gen_person_link(person_id, person_name, snapshot_context=None, link_attrs={}): """ - Utility function for generating a link to a SWH person HTML view + Utility function for generating a link to a person HTML view to insert in Django templates. Args: - person_id (int): a SWH person id + person_id (int): a person id person_name (str): the associated person name link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'person_name' """ query_params = None if snapshot_context and snapshot_context['origin_info']: origin_info = snapshot_context['origin_info'] query_params = {'origin_type': origin_info['type'], 'origin': origin_info['url']} if 'timestamp' in snapshot_context['url_args']: query_params['timestamp'] = \ snapshot_context['url_args']['timestamp'] if 'visit_id' in snapshot_context['query_params']: query_params['visit_id'] = \ snapshot_context['query_params']['visit_id'] elif snapshot_context: query_params = {'snapshot_id': snapshot_context['snapshot_id']} person_url = reverse('browse-person', url_args={'person_id': person_id}, query_params=query_params) return gen_link(person_url, person_name or 'None', link_attrs) def gen_revision_url(revision_id, snapshot_context=None): """ - Utility function for generating an url to a SWH revision. + Utility function for generating an url to a revision. Args: - revision_id (str): a SWH revision id + revision_id (str): a revision id snapshot_context (dict): if provided, generate snapshot-dependent browsing url Returns: str: The url to browse the revision """ query_params = None if snapshot_context and snapshot_context['origin_info']: origin_info = snapshot_context['origin_info'] origin_type = snapshot_context['origin_type'] query_params = {'origin_type': origin_type, 'origin': origin_info['url']} if 'timestamp' in snapshot_context['url_args']: query_params['timestamp'] = \ snapshot_context['url_args']['timestamp'] if 'visit_id' in snapshot_context['query_params']: query_params['visit_id'] = \ snapshot_context['query_params']['visit_id'] elif snapshot_context: query_params = {'snapshot_id': snapshot_context['snapshot_id']} return reverse('browse-revision', url_args={'sha1_git': revision_id}, query_params=query_params) def gen_revision_link(revision_id, shorten_id=False, snapshot_context=None, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH revision HTML view + Utility function for generating a link to a revision HTML view to insert in Django templates. Args: - revision_id (str): a SWH revision id + revision_id (str): a revision id shorten_id (boolean): whether to shorten the revision id to 7 characters for the link text snapshot_context (dict): if provided, generate snapshot-dependent browsing link link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: str: An HTML link in the form 'revision_id' """ if not revision_id: return None revision_url = gen_revision_url(revision_id, snapshot_context) if shorten_id: return gen_link(revision_url, revision_id[:7], link_attrs) else: if not link_text: link_text = revision_id return gen_link(revision_url, link_text, link_attrs) def gen_origin_link(origin_info, link_attrs={}): """ - Utility function for generating a link to a SWH origin HTML view + Utility function for generating a link to a software origin HTML view to insert in Django templates. Args: origin_info (dict): a dict filled with origin information (id, type, url) link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'Origin: origin_url' """ # noqa origin_browse_url = reverse('browse-origin', url_args={'origin_type': origin_info['type'], 'origin_url': origin_info['url']}) return gen_link(origin_browse_url, 'Origin: ' + origin_info['url'], link_attrs) def gen_directory_link(sha1_git, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH directory HTML view + Utility function for generating a link to a directory HTML view to insert in Django templates. Args: sha1_git (str): directory identifier link_text (str): optional text for the generated link (the generated url will be used by default) link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'link_text' """ if not sha1_git: return None directory_url = reverse('browse-directory', url_args={'sha1_git': sha1_git}) if not link_text: link_text = directory_url return gen_link(directory_url, link_text, link_attrs) def gen_snapshot_link(snapshot_id, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH snapshot HTML view + Utility function for generating a link to a snapshot HTML view to insert in Django templates. Args: snapshot_id (str): snapshot identifier link_text (str): optional text for the generated link (the generated url will be used by default) link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'link_text' """ snapshot_url = reverse('browse-snapshot', url_args={'snapshot_id': snapshot_id}) if not link_text: link_text = snapshot_url return gen_link(snapshot_url, link_text, link_attrs) def gen_snapshot_directory_link(snapshot_context, revision_id=None, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH directory HTML view + Utility function for generating a link to a directory HTML view in the context of a snapshot to insert in Django templates. Args: snapshot_context (dict): the snapshot information revision_id (str): optional revision identifier in order to use the associated directory link_text (str): optional text to use for the generated link link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'origin_directory_view_url' """ query_params = {'revision': revision_id} if snapshot_context['origin_info']: origin_info = snapshot_context['origin_info'] url_args = {'origin_url': origin_info['url']} if 'timestamp' in snapshot_context['url_args']: url_args['timestamp'] = \ snapshot_context['url_args']['timestamp'] if 'visit_id' in snapshot_context['query_params']: query_params['visit_id'] = \ snapshot_context['query_params']['visit_id'] directory_url = reverse('browse-origin-directory', url_args=url_args, query_params=query_params) else: url_args = {'snapshot_id': snapshot_context['snapshot_id']} directory_url = reverse('browse-snapshot-directory', url_args=url_args, query_params=query_params) if not link_text: link_text = directory_url return gen_link(directory_url, link_text, link_attrs) def gen_content_link(sha1_git, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH content HTML view + Utility function for generating a link to a content HTML view to insert in Django templates. Args: sha1_git (str): content identifier link_text (str): optional text for the generated link (the generated url will be used by default) link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'link_text' """ if not sha1_git: return None content_url = reverse('browse-content', url_args={'query_string': 'sha1_git:' + sha1_git}) if not link_text: link_text = content_url return gen_link(content_url, link_text, link_attrs) def get_revision_log_url(revision_id, snapshot_context=None): """ - Utility function for getting the URL for a SWH revision log HTML view + Utility function for getting the URL for a revision log HTML view (possibly in the context of an origin). Args: revision_id (str): revision identifier the history heads to snapshot_context (dict): if provided, generate snapshot-dependent browsing link Returns: - The SWH revision log view URL + The revision log view URL """ query_params = {'revision': revision_id} if snapshot_context and snapshot_context['origin_info']: origin_info = snapshot_context['origin_info'] url_args = {'origin_url': origin_info['url']} if 'timestamp' in snapshot_context['url_args']: url_args['timestamp'] = \ snapshot_context['url_args']['timestamp'] if 'visit_id' in snapshot_context['query_params']: query_params['visit_id'] = \ snapshot_context['query_params']['visit_id'] revision_log_url = reverse('browse-origin-log', url_args=url_args, query_params=query_params) elif snapshot_context: url_args = {'snapshot_id': snapshot_context['snapshot_id']} revision_log_url = reverse('browse-snapshot-log', url_args=url_args, query_params=query_params) else: revision_log_url = reverse('browse-revision-log', url_args={'sha1_git': revision_id}) return revision_log_url def gen_revision_log_link(revision_id, snapshot_context=None, link_text=None, link_attrs={}): """ - Utility function for generating a link to a SWH revision log HTML view + Utility function for generating a link to a revision log HTML view (possibly in the context of an origin) to insert in Django templates. Args: revision_id (str): revision identifier the history heads to snapshot_context (dict): if provided, generate snapshot-dependent browsing link link_text (str): optional text to use for the generated link link_attrs (dict): optional attributes (e.g. class) to add to the link Returns: An HTML link in the form 'link_text' """ if not revision_id: return None revision_log_url = get_revision_log_url(revision_id, snapshot_context) if not link_text: link_text = revision_log_url return gen_link(revision_log_url, link_text, link_attrs) def format_log_entries(revision_log, per_page, snapshot_context=None): """ Utility functions that process raw revision log data for HTML display. Its purpose is to: - * add links to relevant SWH browse views + * add links to relevant browse views * format date in human readable format * truncate the message log Args: - revision_log (list): raw revision log as returned by the SWH web api + revision_log (list): raw revision log as returned by the swh-web api per_page (int): number of log entries per page snapshot_context (dict): if provided, generate snapshot-dependent browsing link """ revision_log_data = [] for i, rev in enumerate(revision_log): if i == per_page: break author_name = 'None' author_fullname = 'None' committer_fullname = 'None' if rev['author']: author_name = rev['author']['name'] or rev['author']['fullname'] author_fullname = rev['author']['fullname'] if rev['committer']: committer_fullname = rev['committer']['fullname'] author_date = format_utc_iso_date(rev['date']) committer_date = format_utc_iso_date(rev['committer_date']) tooltip = 'revision %s\n' % rev['id'] tooltip += 'author: %s\n' % author_fullname tooltip += 'author date: %s\n' % author_date tooltip += 'committer: %s\n' % committer_fullname tooltip += 'committer date: %s\n\n' % committer_date tooltip += textwrap.indent(rev['message'], ' '*4) revision_log_data.append({ 'author': author_name, 'id': rev['id'][:7], 'message': rev['message'], 'date': author_date, 'commit_date': committer_date, 'url': gen_revision_url(rev['id'], snapshot_context), 'tooltip': tooltip }) return revision_log_data # list of origin types that can be found in the swh archive # TODO: retrieve it dynamically in an efficient way instead # of hardcoding it _swh_origin_types = ['git', 'svn', 'deb', 'hg', 'ftp', 'deposit', 'pypi'] def get_origin_info(origin_url, origin_type=None): """ - Get info about a SWH origin. + Get info about a software origin. Its main purpose is to automatically find an origin type when it is not provided as parameter. Args: - origin_url (str): complete url of a SWH origin + origin_url (str): complete url of a software origin origin_type (str): optional origin type Returns: A dict with the following entries: * type: the origin type * url: the origin url - * id: the SWH internal id of the origin + * id: the internal id of the origin """ if origin_type: return service.lookup_origin({'type': origin_type, 'url': origin_url}) else: for origin_type in _swh_origin_types: try: origin_info = service.lookup_origin({'type': origin_type, 'url': origin_url}) return origin_info except Exception: pass raise NotFoundExc('Origin with url %s not found!' % origin_url) def get_snapshot_context(snapshot_id=None, origin_type=None, origin_url=None, timestamp=None, visit_id=None): """ Utility function to compute relevant information when navigating - the SWH archive in a snapshot context. The snapshot is either + the archive in a snapshot context. The snapshot is either referenced by its id or it will be retrieved from an origin visit. Args: snapshot_id (str): hexadecimal representation of a snapshot identifier, all other parameters will be ignored if it is provided origin_type (str): the origin type (git, svn, deposit, ...) origin_url (str): the origin_url (e.g. https://github.com/(user)/(repo)/) timestamp (str): a datetime string for retrieving the closest - SWH visit of the origin + visit of the origin visit_id (int): optional visit id for disambiguation in case of several visits with the same timestamp Returns: A dict with the following entries: * origin_info: dict containing origin information - * visit_info: dict containing SWH visit information + * visit_info: dict containing visit information * branches: the list of branches for the origin found during the visit * releases: the list of releases for the origin found during the visit * origin_browse_url: the url to browse the origin * origin_branches_url: the url to browse the origin branches * origin_releases_url': the url to browse the origin releases * origin_visit_url: the url to browse the snapshot of the origin found during the visit * url_args: dict containing url arguments to use when browsing in the context of the origin and its visit Raises: NotFoundExc: if no snapshot is found for the visit of an origin. """ # noqa origin_info = None visit_info = None url_args = None query_params = {} branches = [] releases = [] browse_url = None visit_url = None branches_url = None releases_url = None swh_type = 'snapshot' if origin_url: swh_type = 'origin' origin_info = get_origin_info(origin_url, origin_type) visit_info = get_origin_visit(origin_info, timestamp, visit_id, snapshot_id) fmt_date = format_utc_iso_date(visit_info['date']) visit_info['fmt_date'] = fmt_date snapshot_id = visit_info['snapshot'] if not snapshot_id: raise NotFoundExc('No snapshot associated to the visit of origin ' '%s on %s' % (origin_url, fmt_date)) # provided timestamp is not necessarily equals to the one # of the retrieved visit, so get the exact one in order # use it in the urls generated below if timestamp: timestamp = visit_info['date'] branches, releases = \ get_origin_visit_snapshot(origin_info, timestamp, visit_id, snapshot_id) url_args = {'origin_type': origin_type, 'origin_url': origin_info['url']} query_params = {'visit_id': visit_id} browse_url = reverse('browse-origin-visits', url_args=url_args) if timestamp: url_args['timestamp'] = format_utc_iso_date(timestamp, '%Y-%m-%dT%H:%M:%S') visit_url = reverse('browse-origin-directory', url_args=url_args, query_params=query_params) visit_info['url'] = visit_url branches_url = reverse('browse-origin-branches', url_args=url_args, query_params=query_params) releases_url = reverse('browse-origin-releases', url_args=url_args, query_params=query_params) elif snapshot_id: branches, releases = get_snapshot_content(snapshot_id) url_args = {'snapshot_id': snapshot_id} browse_url = reverse('browse-snapshot', url_args=url_args) branches_url = reverse('browse-snapshot-branches', url_args=url_args) releases_url = reverse('browse-snapshot-releases', url_args=url_args) releases = list(reversed(releases)) snapshot_size = service.lookup_snapshot_size(snapshot_id) is_empty = sum(snapshot_size.values()) == 0 swh_snp_id = persistent_identifier('snapshot', snapshot_id) return { 'swh_type': swh_type, 'swh_object_id': swh_snp_id, 'snapshot_id': snapshot_id, 'snapshot_size': snapshot_size, 'is_empty': is_empty, 'origin_info': origin_info, # keep track if the origin type was provided as url argument 'origin_type': origin_type, 'visit_info': visit_info, 'branches': branches, 'releases': releases, 'branch': None, 'release': None, 'browse_url': browse_url, 'branches_url': branches_url, 'releases_url': releases_url, 'url_args': url_args, 'query_params': query_params } # list of common readme names ordered by preference # (lower indices have higher priority) _common_readme_names = [ "readme.markdown", "readme.md", "readme.rst", "readme.txt", "readme" ] def get_readme_to_display(readmes): """ Process a list of readme files found in a directory in order to find the adequate one to display. Args: readmes: a list of dict where keys are readme file names and values are readme sha1s Returns: A tuple (readme_name, readme_sha1) """ readme_name = None readme_url = None readme_sha1 = None readme_html = None lc_readmes = {k.lower(): {'orig_name': k, 'sha1': v} for k, v in readmes.items()} # look for readme names according to the preference order # defined by the _common_readme_names list for common_readme_name in _common_readme_names: if common_readme_name in lc_readmes: readme_name = lc_readmes[common_readme_name]['orig_name'] readme_sha1 = lc_readmes[common_readme_name]['sha1'] readme_url = reverse('browse-content-raw', url_args={'query_string': readme_sha1}) break # otherwise pick the first readme like file if any if not readme_name and len(readmes.items()) > 0: readme_name = next(iter(readmes)) readme_sha1 = readmes[readme_name] readme_url = reverse('browse-content-raw', url_args={'query_string': readme_sha1}) # convert rst README to html server side as there is # no viable solution to perform that task client side if readme_name and readme_name.endswith('.rst'): cache_entry_id = 'readme_%s' % readme_sha1 cache_entry = cache.get(cache_entry_id) if cache_entry: readme_html = cache_entry else: try: rst_doc = request_content(readme_sha1) readme_html = pypandoc.convert_text(rst_doc['raw_data'], 'html', format='rst') cache.set(cache_entry_id, readme_html) except Exception: readme_html = 'Readme bytes are not available' return readme_name, readme_url, readme_html def get_swh_persistent_ids(swh_objects, snapshot_context=None): """ Returns a list of dict containing info related to persistent identifiers of swh objects. Args: swh_objects (list): a list of dict with the following keys: * type: swh object type (content/directory/release/revision/snapshot) * id: swh object id snapshot_context (dict): optional parameter describing the snapshot in which the object has been found Returns: list: a list of dict with the following keys: * object_type: the swh object type (content/directory/release/revision/snapshot) * object_icon: the swh object icon to use in HTML views * swh_id: the computed swh object persistent identifier * swh_id_url: the url resolving the persistent identifier * show_options: boolean indicating if the persistent id options must be displayed in persistent ids HTML view """ # noqa swh_ids = [] for swh_object in swh_objects: if not swh_object['id']: continue swh_id = get_swh_persistent_id(swh_object['type'], swh_object['id']) show_options = swh_object['type'] == 'content' or \ (snapshot_context and snapshot_context['origin_info'] is not None) object_icon = swh_object_icons[swh_object['type']] swh_ids.append({ 'object_type': swh_object['type'], 'object_icon': object_icon, 'swh_id': swh_id, 'swh_id_url': reverse('browse-swh-id', url_args={'swh_id': swh_id}), 'show_options': show_options }) return swh_ids diff --git a/swh/web/browse/views/content.py b/swh/web/browse/views/content.py index 492c26c8..0652aa1c 100644 --- a/swh/web/browse/views/content.py +++ b/swh/web/browse/views/content.py @@ -1,298 +1,302 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import difflib import json from distutils.util import strtobool from django.http import HttpResponse from django.shortcuts import render from django.template.defaultfilters import filesizeformat from swh.model.hashutil import hash_to_hex from swh.web.common import query from swh.web.common.utils import ( reverse, gen_path_info, swh_object_icons ) from swh.web.common.exc import NotFoundExc, handle_view_exception from swh.web.browse.utils import ( request_content, prepare_content_for_display, content_display_max_size, get_snapshot_context, get_swh_persistent_ids, gen_link ) from swh.web.browse.browseurls import browse_route @browse_route(r'content/(?P.+)/raw/', view_name='browse-content-raw') def content_raw(request, query_string): - """Django view that produces a raw display of a SWH content identified + """Django view that produces a raw display of a content identified by its hash value. The url that points to it is :http:get:`/browse/content/[(algo_hash):](hash)/raw/` """ # noqa try: algo, checksum = query.parse_hash(query_string) checksum = hash_to_hex(checksum) content_data = request_content(query_string, max_size=None, reencode=False) except Exception as exc: return handle_view_exception(request, exc) filename = request.GET.get('filename', None) if not filename: filename = '%s_%s' % (algo, checksum) if content_data['mimetype'].startswith('text/') or \ content_data['mimetype'] == 'inode/x-empty': response = HttpResponse(content_data['raw_data'], content_type="text/plain") response['Content-disposition'] = 'filename=%s' % filename else: response = HttpResponse(content_data['raw_data'], content_type='application/octet-stream') response['Content-disposition'] = 'attachment; filename=%s' % filename return response _auto_diff_size_limit = 20000 @browse_route(r'content/(?P.*)/diff/(?P.*)', # noqa view_name='diff-contents') def _contents_diff(request, from_query_string, to_query_string): """ Browse endpoint used to compute unified diffs between two contents. Diffs are generated only if the two contents are textual. By default, diffs whose size are greater than 20 kB will not be generated. To force the generation of large diffs, the 'force' boolean query parameter must be used. Args: request: input django http request from_query_string: a string of the form "[ALGO_HASH:]HASH" where - optional ALGO_HASH can be either *sha1*, *sha1_git*, *sha256*, - or *blake2s256* (default to *sha1*) and HASH the hexadecimal - representation of the hash value identifying the first content + optional ALGO_HASH can be either ``sha1``, ``sha1_git``, + ``sha256``, or ``blake2s256`` (default to ``sha1``) and HASH + the hexadecimal representation of the hash value identifying + the first content to_query_string: same as above for identifying the second content Returns: A JSON object containing the unified diff. """ diff_data = {} content_from = None content_to = None content_from_size = 0 content_to_size = 0 content_from_lines = [] content_to_lines = [] force = request.GET.get('force', 'false') path = request.GET.get('path', None) language = 'nohighlight' force = bool(strtobool(force)) if from_query_string == to_query_string: diff_str = 'File renamed without changes' else: try: text_diff = True if from_query_string: content_from = \ request_content(from_query_string, max_size=None) content_from_display_data = \ prepare_content_for_display(content_from['raw_data'], content_from['mimetype'], path) language = content_from_display_data['language'] content_from_size = content_from['length'] if not (content_from['mimetype'].startswith('text/') or content_from['mimetype'] == 'inode/x-empty'): text_diff = False if text_diff and to_query_string: content_to = request_content(to_query_string, max_size=None) content_to_display_data = prepare_content_for_display( content_to['raw_data'], content_to['mimetype'], path) language = content_to_display_data['language'] content_to_size = content_to['length'] if not (content_to['mimetype'].startswith('text/') or content_to['mimetype'] == 'inode/x-empty'): text_diff = False diff_size = abs(content_to_size - content_from_size) if not text_diff: diff_str = 'Diffs are not generated for non textual content' language = 'nohighlight' elif not force and diff_size > _auto_diff_size_limit: diff_str = 'Large diffs are not automatically computed' language = 'nohighlight' else: if content_from: content_from_lines = \ content_from['raw_data'].decode('utf-8')\ .splitlines(True) if content_from_lines and \ content_from_lines[-1][-1] != '\n': content_from_lines[-1] += '[swh-no-nl-marker]\n' if content_to: content_to_lines = content_to['raw_data'].decode('utf-8')\ .splitlines(True) if content_to_lines and content_to_lines[-1][-1] != '\n': content_to_lines[-1] += '[swh-no-nl-marker]\n' diff_lines = difflib.unified_diff(content_from_lines, content_to_lines) diff_str = ''.join(list(diff_lines)[2:]) except Exception as e: diff_str = str(e) diff_data['diff_str'] = diff_str diff_data['language'] = language diff_data_json = json.dumps(diff_data, separators=(',', ': ')) return HttpResponse(diff_data_json, content_type='application/json') @browse_route(r'content/(?P.+)/', view_name='browse-content') def content_display(request, query_string): - """Django view that produces an HTML display of a SWH content identified + """Django view that produces an HTML display of a content identified by its hash value. The url that points to it is :http:get:`/browse/content/[(algo_hash):](hash)/` """ # noqa try: algo, checksum = query.parse_hash(query_string) checksum = hash_to_hex(checksum) content_data = request_content(query_string, raise_if_unavailable=False) origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) snapshot_context = None if origin_url: try: snapshot_context = get_snapshot_context(None, origin_type, origin_url) except Exception: raw_cnt_url = reverse('browse-content', url_args={'query_string': query_string}) error_message = \ ('The Software Heritage archive has a content ' 'with the hash you provided but the origin ' 'mentioned in your request appears broken: %s. ' 'Please check the URL and try again.\n\n' 'Nevertheless, you can still browse the content ' 'without origin information: %s' % (gen_link(origin_url), gen_link(raw_cnt_url))) raise NotFoundExc(error_message) if snapshot_context: snapshot_context['visit_info'] = None except Exception as exc: return handle_view_exception(request, exc) path = request.GET.get('path', None) content = None language = None mimetype = None if content_data['raw_data'] is not None: content_display_data = prepare_content_for_display( content_data['raw_data'], content_data['mimetype'], path) content = content_display_data['content_data'] language = content_display_data['language'] mimetype = content_display_data['mimetype'] root_dir = None filename = None path_info = None query_params = {'origin': origin_url} breadcrumbs = [] if path: split_path = path.split('/') root_dir = split_path[0] filename = split_path[-1] - path = path.replace(root_dir + '/', '') - path = path[:-len(filename)] - path_info = gen_path_info(path) - breadcrumbs.append({'name': root_dir[:7], - 'url': reverse('browse-directory', - url_args={'sha1_git': root_dir}, - query_params=query_params)}) - for pi in path_info: - breadcrumbs.append({'name': pi['name'], - 'url': reverse('browse-directory', - url_args={'sha1_git': root_dir, - 'path': pi['path']}, - query_params=query_params)}) + if root_dir != path: + path = path.replace(root_dir + '/', '') + path = path[:-len(filename)] + path_info = gen_path_info(path) + dir_url = reverse('browse-directory', + url_args={'sha1_git': root_dir}, + query_params=query_params) + breadcrumbs.append({'name': root_dir[:7], + 'url': dir_url}) + for pi in path_info: + dir_url = reverse('browse-directory', + url_args={'sha1_git': root_dir, + 'path': pi['path']}, + query_params=query_params) + breadcrumbs.append({'name': pi['name'], + 'url': dir_url}) breadcrumbs.append({'name': filename, 'url': None}) query_params = {'filename': filename} content_raw_url = reverse('browse-content-raw', url_args={'query_string': query_string}, query_params=query_params) content_metadata = { 'sha1 checksum': content_data['checksums']['sha1'], 'sha1_git checksum': content_data['checksums']['sha1_git'], 'sha256 checksum': content_data['checksums']['sha256'], 'blake2s256 checksum': content_data['checksums']['blake2s256'], 'mime type': content_data['mimetype'], 'encoding': content_data['encoding'], 'size': filesizeformat(content_data['length']), 'language': content_data['language'], 'licenses': content_data['licenses'], 'filename': filename } if filename: content_metadata['filename'] = filename sha1_git = content_data['checksums']['sha1_git'] swh_ids = get_swh_persistent_ids([{'type': 'content', 'id': sha1_git}]) heading = 'Content - %s' % sha1_git if breadcrumbs: content_path = '/'.join([bc['name'] for bc in breadcrumbs]) heading += ' - %s' % content_path return render(request, 'browse/content.html', {'heading': heading, 'swh_object_id': swh_ids[0]['swh_id'], 'swh_object_name': 'Content', 'swh_object_metadata': content_metadata, 'content': content, 'content_size': content_data['length'], 'max_content_size': content_display_max_size, 'mimetype': mimetype, 'language': language, 'breadcrumbs': breadcrumbs, 'top_right_link': { 'url': content_raw_url, 'icon': swh_object_icons['content'], 'text': 'Raw File' }, 'snapshot_context': snapshot_context, 'vault_cooking': None, 'show_actions_menu': True, 'swh_ids': swh_ids, 'error_code': content_data['error_code'], 'error_message': content_data['error_message'], 'error_description': content_data['error_description']}, status=content_data['error_code']) diff --git a/swh/web/browse/views/directory.py b/swh/web/browse/views/directory.py index c7cd2a02..723fd2a6 100644 --- a/swh/web/browse/views/directory.py +++ b/swh/web/browse/views/directory.py @@ -1,160 +1,160 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.shortcuts import render, redirect from django.template.defaultfilters import filesizeformat from swh.web.common import service from swh.web.common.utils import ( reverse, gen_path_info ) from swh.web.common.exc import handle_view_exception, NotFoundExc from swh.web.browse.utils import ( get_directory_entries, get_snapshot_context, get_readme_to_display, get_swh_persistent_ids, gen_link ) from swh.web.browse.browseurls import browse_route @browse_route(r'directory/(?P[0-9a-f]+)/', r'directory/(?P[0-9a-f]+)/(?P.+)/', view_name='browse-directory') def directory_browse(request, sha1_git, path=None): - """Django view for browsing the content of a SWH directory identified + """Django view for browsing the content of a directory identified by its sha1_git value. The url that points to it is :http:get:`/browse/directory/(sha1_git)/[(path)/]` """ # noqa root_sha1_git = sha1_git try: if path: dir_info = service.lookup_directory_with_path(sha1_git, path) # some readme files can reference assets reachable from the # browsed directory, handle that special case in order to # correctly displayed them if dir_info and dir_info['type'] == 'file': file_raw_url = reverse( 'browse-content-raw', url_args={'query_string': dir_info['checksums']['sha1']}) return redirect(file_raw_url) sha1_git = dir_info['target'] dirs, files = get_directory_entries(sha1_git) origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) snapshot_context = None if origin_url: try: snapshot_context = get_snapshot_context(None, origin_type, origin_url) except Exception: raw_dir_url = reverse('browse-directory', url_args={'sha1_git': sha1_git}) error_message = \ ('The Software Heritage archive has a directory ' 'with the hash you provided but the origin ' 'mentioned in your request appears broken: %s. ' 'Please check the URL and try again.\n\n' 'Nevertheless, you can still browse the directory ' 'without origin information: %s' % (gen_link(origin_url), gen_link(raw_dir_url))) raise NotFoundExc(error_message) if snapshot_context: snapshot_context['visit_info'] = None except Exception as exc: return handle_view_exception(request, exc) path_info = gen_path_info(path) query_params = {'origin': origin_url} breadcrumbs = [] breadcrumbs.append({'name': root_sha1_git[:7], 'url': reverse('browse-directory', url_args={'sha1_git': root_sha1_git}, query_params=query_params)}) for pi in path_info: breadcrumbs.append({'name': pi['name'], 'url': reverse('browse-directory', url_args={'sha1_git': root_sha1_git, 'path': pi['path']}, query_params=query_params)}) path = '' if path is None else (path + '/') for d in dirs: if d['type'] == 'rev': d['url'] = reverse('browse-revision', url_args={'sha1_git': d['target']}, query_params=query_params) else: d['url'] = reverse('browse-directory', url_args={'sha1_git': root_sha1_git, 'path': path + d['name']}, query_params=query_params) sum_file_sizes = 0 readmes = {} for f in files: query_string = 'sha1_git:' + f['target'] f['url'] = reverse('browse-content', url_args={'query_string': query_string}, query_params={'path': root_sha1_git + '/' + path + f['name'], 'origin': origin_url}) if f['length'] is not None: sum_file_sizes += f['length'] f['length'] = filesizeformat(f['length']) if f['name'].lower().startswith('readme'): readmes[f['name']] = f['checksums']['sha1'] readme_name, readme_url, readme_html = get_readme_to_display(readmes) sum_file_sizes = filesizeformat(sum_file_sizes) dir_metadata = {'id': sha1_git, 'number of regular files': len(files), 'number of subdirectories': len(dirs), 'sum of regular file sizes': sum_file_sizes} vault_cooking = { 'directory_context': True, 'directory_id': sha1_git, 'revision_context': False, 'revision_id': None } swh_ids = get_swh_persistent_ids([{'type': 'directory', 'id': sha1_git}]) heading = 'Directory - %s' % sha1_git if breadcrumbs: dir_path = '/'.join([bc['name'] for bc in breadcrumbs]) + '/' heading += ' - %s' % dir_path return render(request, 'browse/directory.html', {'heading': heading, 'swh_object_id': swh_ids[0]['swh_id'], 'swh_object_name': 'Directory', 'swh_object_metadata': dir_metadata, 'dirs': dirs, 'files': files, 'breadcrumbs': breadcrumbs, 'top_right_link': None, 'readme_name': readme_name, 'readme_url': readme_url, 'readme_html': readme_html, 'snapshot_context': snapshot_context, 'vault_cooking': vault_cooking, 'show_actions_menu': True, 'swh_ids': swh_ids}) diff --git a/swh/web/browse/views/origin.py b/swh/web/browse/views/origin.py index f475b27c..72238f53 100644 --- a/swh/web/browse/views/origin.py +++ b/swh/web/browse/views/origin.py @@ -1,240 +1,240 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import json from distutils.util import strtobool from django.http import HttpResponse from django.shortcuts import render, redirect from swh.web.common import service from swh.web.common.utils import ( reverse, format_utc_iso_date, parse_timestamp, get_origin_visits ) from swh.web.common.exc import handle_view_exception from swh.web.browse.utils import ( get_origin_info, get_snapshot_context ) from swh.web.browse.browseurls import browse_route from .utils.snapshot_context import ( browse_snapshot_directory, browse_snapshot_content, browse_snapshot_log, browse_snapshot_branches, browse_snapshot_releases ) @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/directory/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/directory/(?P.+)/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/directory/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/directory/(?P.+)/', # noqa r'origin/(?P.+)/visit/(?P.+)/directory/', # noqa r'origin/(?P.+)/visit/(?P.+)/directory/(?P.+)/', # noqa r'origin/(?P.+)/directory/', # noqa r'origin/(?P.+)/directory/(?P.+)/', # noqa view_name='browse-origin-directory') def origin_directory_browse(request, origin_url, origin_type=None, timestamp=None, path=None): - """Django view for browsing the content of a SWH directory associated + """Django view for browsing the content of a directory associated to an origin for a given visit. The url scheme that points to it is the following: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/directory/[(path)/]` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/directory/[(path)/]` """ # noqa return browse_snapshot_directory( request, origin_type=origin_type, origin_url=origin_url, timestamp=timestamp, path=path) @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/content/(?P.+)/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/content/(?P.+)/', # noqa r'origin/(?P.+)/visit/(?P.+)/content/(?P.+)/', # noqa r'origin/(?P.+)/content/(?P.+)/', # noqa view_name='browse-origin-content') def origin_content_browse(request, origin_url, origin_type=None, path=None, timestamp=None): - """Django view that produces an HTML display of a SWH content + """Django view that produces an HTML display of a content associated to an origin for a given visit. The url scheme that points to it is the following: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/content/(path)/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/content/(path)/` """ # noqa return browse_snapshot_content(request, origin_type=origin_type, origin_url=origin_url, timestamp=timestamp, path=path) PER_PAGE = 20 @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/log/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/log/', r'origin/(?P.+)/visit/(?P.+)/log/', # noqa r'origin/(?P.+)/log/', view_name='browse-origin-log') def origin_log_browse(request, origin_url, origin_type=None, timestamp=None): """Django view that produces an HTML display of revisions history (aka - the commit log) associated to a SWH origin. + the commit log) associated to a software origin. The url scheme that points to it is the following: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/log/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/log/` """ # noqa return browse_snapshot_log(request, origin_type=origin_type, origin_url=origin_url, timestamp=timestamp) @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/branches/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/branches/', # noqa r'origin/(?P.+)/visit/(?P.+)/branches/', # noqa r'origin/(?P.+)/branches/', # noqa view_name='browse-origin-branches') def origin_branches_browse(request, origin_url, origin_type=None, timestamp=None): """Django view that produces an HTML display of the list of branches associated to an origin for a given visit. The url scheme that points to it is the following: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/branches/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/branches/` """ # noqa return browse_snapshot_branches(request, origin_type=origin_type, origin_url=origin_url, timestamp=timestamp) @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visit/(?P.+)/releases/', # noqa r'origin/(?P[a-z]+)/url/(?P.+)/releases/', # noqa r'origin/(?P.+)/visit/(?P.+)/releases/', # noqa r'origin/(?P.+)/releases/', # noqa view_name='browse-origin-releases') def origin_releases_browse(request, origin_url, origin_type=None, timestamp=None): """Django view that produces an HTML display of the list of releases associated to an origin for a given visit. The url scheme that points to it is the following: * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/releases/` * :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visit/(timestamp)/releases/` """ # noqa return browse_snapshot_releases(request, origin_type=origin_type, origin_url=origin_url, timestamp=timestamp) @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/visits/', r'origin/(?P.+)/visits/', view_name='browse-origin-visits') def origin_visits_browse(request, origin_url, origin_type=None): """Django view that produces an HTML display of visits reporting for a swh origin identified by its id or its url. The url that points to it is :http:get:`/browse/origin/[(origin_type)/url/](origin_url)/visits/`. """ # noqa try: origin_info = get_origin_info(origin_url, origin_type) origin_visits = get_origin_visits(origin_info) snapshot_context = get_snapshot_context(origin_type=origin_type, origin_url=origin_url) except Exception as exc: return handle_view_exception(request, exc) for i, visit in enumerate(origin_visits): url_date = format_utc_iso_date(visit['date'], '%Y-%m-%dT%H:%M:%SZ') visit['fmt_date'] = format_utc_iso_date(visit['date']) query_params = {} if i < len(origin_visits) - 1: if visit['date'] == origin_visits[i+1]['date']: query_params = {'visit_id': visit['visit']} if i > 0: if visit['date'] == origin_visits[i-1]['date']: query_params = {'visit_id': visit['visit']} snapshot = visit['snapshot'] if visit['snapshot'] else '' visit['browse_url'] = reverse('browse-origin-directory', url_args={'origin_type': origin_type, 'origin_url': origin_url, 'timestamp': url_date}, query_params=query_params) if not snapshot: visit['snapshot'] = '' visit['date'] = parse_timestamp(visit['date']).timestamp() heading = 'Origin visits - %s' % origin_url return render(request, 'browse/origin-visits.html', {'heading': heading, 'swh_object_name': 'Visits', 'swh_object_metadata': origin_info, 'origin_visits': origin_visits, 'origin_info': origin_info, 'snapshot_context': snapshot_context, 'vault_cooking': None, 'show_actions_menu': False}) @browse_route(r'origin/search/(?P.+)/', view_name='browse-origin-search') def _origin_search(request, url_pattern): """Internal browse endpoint to search for origins whose urls contain a provided string pattern or match a provided regular expression. The search is performed in a case insensitive way. """ offset = int(request.GET.get('offset', '0')) limit = int(request.GET.get('limit', '50')) regexp = request.GET.get('regexp', 'false') with_visit = request.GET.get('with_visit', 'false') url_pattern = url_pattern.replace('///', '\\') try: results = service.search_origin(url_pattern, offset, limit, bool(strtobool(regexp)), bool(strtobool(with_visit))) results = json.dumps(list(results), sort_keys=True, indent=4, separators=(',', ': ')) except Exception as exc: return handle_view_exception(request, exc, html_response=False) return HttpResponse(results, content_type='application/json') @browse_route(r'origin/(?P[0-9]+)/latest_snapshot/', view_name='browse-origin-latest-snapshot') def _origin_latest_snapshot(request, origin_id): """ Internal browse endpoint used to check if an origin has already been visited by Software Heritage and has at least one full visit. """ result = service.lookup_latest_origin_snapshot(origin_id, allowed_statuses=['full']) result = json.dumps(result, sort_keys=True, indent=4, separators=(',', ': ')) return HttpResponse(result, content_type='application/json') @browse_route(r'origin/(?P[a-z]+)/url/(?P.+)/', r'origin/(?P.+)/', view_name='browse-origin') def origin_browse(request, origin_url, origin_type=None): """Django view that redirects to the display of the latest archived snapshot for a given software origin. """ # noqa last_snapshot_url = reverse('browse-origin-directory', url_args={'origin_type': origin_type, 'origin_url': origin_url}) return redirect(last_snapshot_url) diff --git a/swh/web/browse/views/release.py b/swh/web/browse/views/release.py index d2a9176b..8a01e917 100644 --- a/swh/web/browse/views/release.py +++ b/swh/web/browse/views/release.py @@ -1,212 +1,212 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.shortcuts import render from swh.web.common import service from swh.web.common.utils import ( reverse, format_utc_iso_date ) from swh.web.common.exc import NotFoundExc, handle_view_exception from swh.web.browse.browseurls import browse_route from swh.web.browse.utils import ( gen_person_link, gen_revision_link, get_snapshot_context, gen_link, gen_snapshot_link, get_swh_persistent_ids ) @browse_route(r'release/(?P[0-9a-f]+)/', view_name='browse-release') def release_browse(request, sha1_git): """ - Django view that produces an HTML display of a SWH release + Django view that produces an HTML display of a release identified by its id. The url that points to it is :http:get:`/browse/release/(sha1_git)/`. """ try: release = service.lookup_release(sha1_git) snapshot_context = None origin_info = None snapshot_id = request.GET.get('snapshot_id', None) origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) timestamp = request.GET.get('timestamp', None) visit_id = request.GET.get('visit_id', None) if origin_url: try: snapshot_context = \ get_snapshot_context(snapshot_id, origin_type, origin_url, timestamp, visit_id) except Exception: raw_rel_url = reverse('browse-release', url_args={'sha1_git': sha1_git}) error_message = \ ('The Software Heritage archive has a release ' 'with the hash you provided but the origin ' 'mentioned in your request appears broken: %s. ' 'Please check the URL and try again.\n\n' 'Nevertheless, you can still browse the release ' 'without origin information: %s' % (gen_link(origin_url), gen_link(raw_rel_url))) raise NotFoundExc(error_message) origin_info = snapshot_context['origin_info'] elif snapshot_id: snapshot_context = get_snapshot_context(snapshot_id) except Exception as exc: return handle_view_exception(request, exc) release_data = {} author_name = 'None' release_data['author'] = 'None' if release['author']: author_name = release['author']['name'] or \ release['author']['fullname'] release_data['author'] = \ gen_person_link(release['author']['id'], author_name, snapshot_context) release_data['date'] = format_utc_iso_date(release['date']) release_data['id'] = sha1_git release_data['name'] = release['name'] release_data['synthetic'] = release['synthetic'] release_data['target type'] = release['target_type'] if release['target_type'] == 'revision': release_data['target'] = \ gen_revision_link(release['target'], snapshot_context=snapshot_context) elif release['target_type'] == 'content': content_url = \ reverse('browse-content', url_args={'query_string': 'sha1_git:' + release['target']}) release_data['target'] = gen_link(content_url, release['target']) elif release['target_type'] == 'directory': directory_url = \ reverse('browse-directory', url_args={'sha1_git': release['target']}) release_data['target'] = gen_link(directory_url, release['target']) elif release['target_type'] == 'release': release_url = \ reverse('browse-release', url_args={'sha1_git': release['target']}) release_data['target'] = gen_link(release_url, release['target']) release_note_lines = [] if release['message']: release_note_lines = release['message'].split('\n') vault_cooking = None query_params = {} if snapshot_id: query_params = {'snapshot_id': snapshot_id} elif origin_info: query_params = {'origin': origin_info['url']} target_url = '' if release['target_type'] == 'revision': target_url = reverse('browse-revision', url_args={'sha1_git': release['target']}, query_params=query_params) try: revision = service.lookup_revision(release['target']) vault_cooking = { 'directory_context': True, 'directory_id': revision['directory'], 'revision_context': True, 'revision_id': release['target'] } except Exception: pass elif release['target_type'] == 'directory': target_url = reverse('browse-directory', url_args={'sha1_git': release['target']}, query_params=query_params) try: revision = service.lookup_directory(release['target']) vault_cooking = { 'directory_context': True, 'directory_id': revision['directory'], 'revision_context': False, 'revision_id': None } except Exception: pass elif release['target_type'] == 'content': target_url = reverse('browse-content', url_args={'sha1_git': release['target']}, query_params=query_params) elif release['target_type'] == 'release': target_url = reverse('browse-release', url_args={'sha1_git': release['target']}, query_params=query_params) release['target_url'] = target_url if snapshot_context: release_data['snapshot id'] = snapshot_context['snapshot_id'] if origin_info: release_url = reverse('browse-release', url_args={'sha1_git': release['id']}) release_data['context-independent release'] = \ gen_link(release_url, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) release_data['origin id'] = origin_info['id'] release_data['origin type'] = origin_info['type'] release_data['origin url'] = gen_link(origin_info['url'], origin_info['url']) browse_snapshot_link = \ gen_snapshot_link(snapshot_context['snapshot_id'], link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) release_data['snapshot'] = browse_snapshot_link swh_objects = [{'type': 'release', 'id': sha1_git}] if snapshot_context: snapshot_id = snapshot_context['snapshot_id'] if snapshot_id: swh_objects.append({'type': 'snapshot', 'id': snapshot_id}) swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) note_header = 'None' if len(release_note_lines) > 0: note_header = release_note_lines[0] release['note_header'] = note_header release['note_body'] = '\n'.join(release_note_lines[1:]) heading = 'Release - %s' % release['name'] if snapshot_context: context_found = 'snapshot: %s' % snapshot_context['snapshot_id'] if origin_info: context_found = 'origin: %s' % origin_info['url'] heading += ' - %s' % context_found return render(request, 'browse/release.html', {'heading': heading, 'swh_object_id': swh_ids[0]['swh_id'], 'swh_object_name': 'Release', 'swh_object_metadata': release_data, 'release': release, 'snapshot_context': snapshot_context, 'show_actions_menu': True, 'breadcrumbs': None, 'vault_cooking': vault_cooking, 'top_right_link': None, 'swh_ids': swh_ids}) diff --git a/swh/web/browse/views/revision.py b/swh/web/browse/views/revision.py index 38ac23bf..c4a6ca89 100644 --- a/swh/web/browse/views/revision.py +++ b/swh/web/browse/views/revision.py @@ -1,551 +1,551 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import hashlib import json import textwrap from django.http import HttpResponse from django.shortcuts import render, redirect from django.template.defaultfilters import filesizeformat from django.utils.safestring import mark_safe from swh.model.identifiers import persistent_identifier from swh.web.common import service from swh.web.common.utils import ( reverse, format_utc_iso_date, gen_path_info, swh_object_icons ) from swh.web.common.exc import NotFoundExc, handle_view_exception from swh.web.browse.browseurls import browse_route from swh.web.browse.utils import ( gen_link, gen_person_link, gen_revision_link, gen_revision_url, get_snapshot_context, gen_snapshot_directory_link, get_revision_log_url, get_directory_entries, gen_directory_link, request_content, prepare_content_for_display, content_display_max_size, gen_snapshot_link, get_readme_to_display, get_swh_persistent_ids, format_log_entries ) def _gen_content_url(revision, query_string, path, snapshot_context): if snapshot_context: url_args = snapshot_context['url_args'] url_args['path'] = path query_params = snapshot_context['query_params'] query_params['revision'] = revision['id'] content_url = reverse('browse-origin-content', url_args=url_args, query_params=query_params) else: content_path = '%s/%s' % (revision['directory'], path) content_url = reverse('browse-content', url_args={'query_string': query_string}, query_params={'path': content_path}) return content_url def _gen_diff_link(idx, diff_anchor, link_text): if idx < _max_displayed_file_diffs: return gen_link(diff_anchor, link_text) else: return link_text # TODO: put in conf _max_displayed_file_diffs = 1000 def _gen_revision_changes_list(revision, changes, snapshot_context): """ Returns a HTML string describing the file changes introduced in a revision. As this string will be displayed in the browse revision view, links to adequate file diffs are also generated. Args: revision (str): hexadecimal representation of a revision identifier changes (list): list of file changes in the revision snapshot_context (dict): optional origin context used to reverse the content urls Returns: A string to insert in a revision HTML view. """ changes_msg = [] for i, change in enumerate(changes): hasher = hashlib.sha1() from_query_string = '' to_query_string = '' diff_id = 'diff-' if change['from']: from_query_string = 'sha1_git:' + change['from']['target'] diff_id += change['from']['target'] + '-' + change['from_path'] diff_id += '-' if change['to']: to_query_string = 'sha1_git:' + change['to']['target'] diff_id += change['to']['target'] + change['to_path'] change['path'] = change['to_path'] or change['from_path'] url_args = {'from_query_string': from_query_string, 'to_query_string': to_query_string} query_params = {'path': change['path']} change['diff_url'] = reverse('diff-contents', url_args=url_args, query_params=query_params) hasher.update(diff_id.encode('utf-8')) diff_id = hasher.hexdigest() change['id'] = diff_id panel_diff_link = '#panel_' + diff_id if change['type'] == 'modify': change['content_url'] = \ _gen_content_url(revision, to_query_string, change['to_path'], snapshot_context) changes_msg.append('modified: %s' % _gen_diff_link(i, panel_diff_link, change['to_path'])) elif change['type'] == 'insert': change['content_url'] = \ _gen_content_url(revision, to_query_string, change['to_path'], snapshot_context) changes_msg.append('new file: %s' % _gen_diff_link(i, panel_diff_link, change['to_path'])) elif change['type'] == 'delete': parent = service.lookup_revision(revision['parents'][0]) change['content_url'] = \ _gen_content_url(parent, from_query_string, change['from_path'], snapshot_context) changes_msg.append('deleted: %s' % _gen_diff_link(i, panel_diff_link, change['from_path'])) elif change['type'] == 'rename': change['content_url'] = \ _gen_content_url(revision, to_query_string, change['to_path'], snapshot_context) link_text = change['from_path'] + ' → ' + change['to_path'] changes_msg.append('renamed: %s' % _gen_diff_link(i, panel_diff_link, link_text)) if not changes: changes_msg.append('No changes') return mark_safe('\n'.join(changes_msg)) @browse_route(r'revision/(?P[0-9a-f]+)/diff/', view_name='diff-revision') def _revision_diff(request, sha1_git): """ Browse internal endpoint to compute revision diff """ try: revision = service.lookup_revision(sha1_git) snapshot_context = None origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) timestamp = request.GET.get('timestamp', None) visit_id = request.GET.get('visit_id', None) if origin_url: snapshot_context = get_snapshot_context(None, origin_type, origin_url, timestamp, visit_id) except Exception as exc: return handle_view_exception(request, exc) changes = service.diff_revision(sha1_git) changes_msg = _gen_revision_changes_list(revision, changes, snapshot_context) diff_data = { 'total_nb_changes': len(changes), 'changes': changes[:_max_displayed_file_diffs], 'changes_msg': changes_msg } diff_data_json = json.dumps(diff_data, separators=(',', ': ')) return HttpResponse(diff_data_json, content_type='application/json') NB_LOG_ENTRIES = 100 @browse_route(r'revision/(?P[0-9a-f]+)/log/', view_name='browse-revision-log') def revision_log_browse(request, sha1_git): """ Django view that produces an HTML display of the history - log for a SWH revision identified by its id. + log for a revision identified by its id. The url that points to it is :http:get:`/browse/revision/(sha1_git)/log/` """ # noqa try: per_page = int(request.GET.get('per_page', NB_LOG_ENTRIES)) offset = int(request.GET.get('offset', 0)) revs_ordering = request.GET.get('revs_ordering', 'committer_date') session_key = 'rev_%s_log_ordering_%s' % (sha1_git, revs_ordering) rev_log_session = request.session.get(session_key, None) rev_log = [] revs_walker_state = None if rev_log_session: rev_log = rev_log_session['rev_log'] revs_walker_state = rev_log_session['revs_walker_state'] if len(rev_log) < offset+per_page: revs_walker = \ service.get_revisions_walker(revs_ordering, sha1_git, max_revs=offset+per_page+1, state=revs_walker_state) rev_log += list(revs_walker) revs_walker_state = revs_walker.export_state() revision_log = rev_log[offset:offset+per_page] request.session[session_key] = { 'rev_log': rev_log, 'revs_walker_state': revs_walker_state } except Exception as exc: return handle_view_exception(request, exc) revs_ordering = request.GET.get('revs_ordering', '') prev_log_url = None if len(rev_log) > offset + per_page: prev_log_url = reverse('browse-revision-log', url_args={'sha1_git': sha1_git}, query_params={'per_page': per_page, 'offset': offset + per_page, 'revs_ordering': revs_ordering}) next_log_url = None if offset != 0: next_log_url = reverse('browse-revision-log', url_args={'sha1_git': sha1_git}, query_params={'per_page': per_page, 'offset': offset - per_page, 'revs_ordering': revs_ordering}) revision_log_data = format_log_entries(revision_log, per_page) swh_rev_id = persistent_identifier('revision', sha1_git) return render(request, 'browse/revision-log.html', {'heading': 'Revision history', 'swh_object_id': swh_rev_id, 'swh_object_name': 'Revisions history', 'swh_object_metadata': None, 'revision_log': revision_log_data, 'revs_ordering': revs_ordering, 'next_log_url': next_log_url, 'prev_log_url': prev_log_url, 'breadcrumbs': None, 'top_right_link': None, 'snapshot_context': None, 'vault_cooking': None, 'show_actions_menu': True, 'swh_ids': None}) @browse_route(r'revision/(?P[0-9a-f]+)/', r'revision/(?P[0-9a-f]+)/(?P.+)/', view_name='browse-revision') def revision_browse(request, sha1_git, extra_path=None): """ - Django view that produces an HTML display of a SWH revision + Django view that produces an HTML display of a revision identified by its id. The url that points to it is :http:get:`/browse/revision/(sha1_git)/`. """ try: revision = service.lookup_revision(sha1_git) # some readme files can reference assets reachable from the # browsed directory, handle that special case in order to # correctly displayed them if extra_path: dir_info = \ service.lookup_directory_with_path(revision['directory'], extra_path) if dir_info and dir_info['type'] == 'file': file_raw_url = reverse( 'browse-content-raw', url_args={'query_string': dir_info['checksums']['sha1']}) return redirect(file_raw_url) origin_info = None snapshot_context = None origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) timestamp = request.GET.get('timestamp', None) visit_id = request.GET.get('visit_id', None) snapshot_id = request.GET.get('snapshot_id', None) path = request.GET.get('path', None) dir_id = None dirs, files = None, None content_data = None if origin_url: try: snapshot_context = get_snapshot_context(None, origin_type, origin_url, timestamp, visit_id) except Exception: raw_rev_url = reverse('browse-revision', url_args={'sha1_git': sha1_git}) error_message = \ ('The Software Heritage archive has a revision ' 'with the hash you provided but the origin ' 'mentioned in your request appears broken: %s. ' 'Please check the URL and try again.\n\n' 'Nevertheless, you can still browse the revision ' 'without origin information: %s' % (gen_link(origin_url), gen_link(raw_rev_url))) raise NotFoundExc(error_message) origin_info = snapshot_context['origin_info'] snapshot_id = snapshot_context['snapshot_id'] elif snapshot_id: snapshot_context = get_snapshot_context(snapshot_id) if path: file_info = \ service.lookup_directory_with_path(revision['directory'], path) if file_info['type'] == 'dir': dir_id = file_info['target'] else: query_string = 'sha1_git:' + file_info['target'] content_data = request_content(query_string, raise_if_unavailable=False) else: dir_id = revision['directory'] if dir_id: path = '' if path is None else (path + '/') dirs, files = get_directory_entries(dir_id) except Exception as exc: return handle_view_exception(request, exc) revision_data = {} author_name = 'None' revision_data['author'] = 'None' if revision['author']: author_name = revision['author']['name'] or \ revision['author']['fullname'] revision_data['author'] = \ gen_person_link(revision['author']['id'], author_name, snapshot_context) revision_data['committer'] = 'None' if revision['committer']: revision_data['committer'] = \ gen_person_link(revision['committer']['id'], revision['committer']['name'], snapshot_context) revision_data['committer date'] = \ format_utc_iso_date(revision['committer_date']) revision_data['date'] = format_utc_iso_date(revision['date']) if snapshot_context: revision_data['snapshot id'] = snapshot_id revision_data['directory'] = \ gen_snapshot_directory_link(snapshot_context, sha1_git, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', # noqa 'role': 'button'}) else: revision_data['directory'] = \ gen_directory_link(revision['directory'], link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) revision_data['id'] = sha1_git revision_data['merge'] = revision['merge'] revision_data['metadata'] = json.dumps(revision['metadata'], sort_keys=True, indent=4, separators=(',', ': ')) if origin_info: revision_data['context-independent revision'] = \ gen_revision_link(sha1_git, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) revision_data['origin id'] = origin_info['id'] revision_data['origin type'] = origin_info['type'] revision_data['origin url'] = gen_link(origin_info['url'], origin_info['url']) browse_snapshot_link = \ gen_snapshot_link(snapshot_id, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) revision_data['snapshot'] = browse_snapshot_link parents = '' for p in revision['parents']: parent_link = gen_revision_link(p, snapshot_context=snapshot_context) parents += parent_link + '
' revision_data['parents'] = mark_safe(parents) revision_data['synthetic'] = revision['synthetic'] revision_data['type'] = revision['type'] message_lines = ['None'] if revision['message']: message_lines = revision['message'].split('\n') parents = [] for p in revision['parents']: parent_url = gen_revision_url(p, snapshot_context) parents.append({'id': p, 'url': parent_url}) path_info = gen_path_info(path) query_params = {'snapshot_id': snapshot_id, 'origin_type': origin_type, 'origin': origin_url, 'timestamp': timestamp, 'visit_id': visit_id} breadcrumbs = [] breadcrumbs.append({'name': revision['directory'][:7], 'url': reverse('browse-revision', url_args={'sha1_git': sha1_git}, query_params=query_params)}) for pi in path_info: query_params['path'] = pi['path'] breadcrumbs.append({'name': pi['name'], 'url': reverse('browse-revision', url_args={'sha1_git': sha1_git}, query_params=query_params)}) vault_cooking = { 'directory_context': False, 'directory_id': None, 'revision_context': True, 'revision_id': sha1_git } swh_objects = [{'type': 'revision', 'id': sha1_git}] content = None content_size = None mimetype = None language = None readme_name = None readme_url = None readme_html = None readmes = {} error_code = 200 error_message = '' error_description = '' if content_data: breadcrumbs[-1]['url'] = None content_size = content_data['length'] mimetype = content_data['mimetype'] if content_data['raw_data']: content_display_data = prepare_content_for_display( content_data['raw_data'], content_data['mimetype'], path) content = content_display_data['content_data'] language = content_display_data['language'] query_params = {} if path: query_params['filename'] = path_info[-1]['name'] top_right_link = { 'url': reverse('browse-content-raw', url_args={'query_string': query_string}, query_params=query_params), 'icon': swh_object_icons['content'], 'text': 'Raw File' } swh_objects.append({'type': 'content', 'id': file_info['target']}) error_code = content_data['error_code'] error_message = content_data['error_message'] error_description = content_data['error_description'] else: for d in dirs: if d['type'] == 'rev': d['url'] = reverse('browse-revision', url_args={'sha1_git': d['target']}) else: query_params['path'] = path + d['name'] d['url'] = reverse('browse-revision', url_args={'sha1_git': sha1_git}, query_params=query_params) for f in files: query_params['path'] = path + f['name'] f['url'] = reverse('browse-revision', url_args={'sha1_git': sha1_git}, query_params=query_params) if f['length'] is not None: f['length'] = filesizeformat(f['length']) if f['name'].lower().startswith('readme'): readmes[f['name']] = f['checksums']['sha1'] readme_name, readme_url, readme_html = get_readme_to_display(readmes) top_right_link = { 'url': get_revision_log_url(sha1_git, snapshot_context), 'icon': swh_object_icons['revisions history'], 'text': 'History' } vault_cooking['directory_context'] = True vault_cooking['directory_id'] = dir_id swh_objects.append({'type': 'directory', 'id': dir_id}) diff_revision_url = reverse('diff-revision', url_args={'sha1_git': sha1_git}, query_params={'origin_type': origin_type, 'origin': origin_url, 'timestamp': timestamp, 'visit_id': visit_id}) if snapshot_id: swh_objects.append({'type': 'snapshot', 'id': snapshot_id}) swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) heading = 'Revision - %s - %s' %\ (sha1_git[:7], textwrap.shorten(message_lines[0], width=70)) if snapshot_context: context_found = 'snapshot: %s' % snapshot_context['snapshot_id'] if origin_info: context_found = 'origin: %s' % origin_info['url'] heading += ' - %s' % context_found return render(request, 'browse/revision.html', {'heading': heading, 'swh_object_id': swh_ids[0]['swh_id'], 'swh_object_name': 'Revision', 'swh_object_metadata': revision_data, 'message_header': message_lines[0], 'message_body': '\n'.join(message_lines[1:]), 'parents': parents, 'snapshot_context': snapshot_context, 'dirs': dirs, 'files': files, 'content': content, 'content_size': content_size, 'max_content_size': content_display_max_size, 'mimetype': mimetype, 'language': language, 'readme_name': readme_name, 'readme_url': readme_url, 'readme_html': readme_html, 'breadcrumbs': breadcrumbs, 'top_right_link': top_right_link, 'vault_cooking': vault_cooking, 'diff_revision_url': diff_revision_url, 'show_actions_menu': True, 'swh_ids': swh_ids, 'error_code': error_code, 'error_message': error_message, 'error_description': error_description}, status=error_code) diff --git a/swh/web/browse/views/snapshot.py b/swh/web/browse/views/snapshot.py index 1bde5eee..f79afe65 100644 --- a/swh/web/browse/views/snapshot.py +++ b/swh/web/browse/views/snapshot.py @@ -1,91 +1,91 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from django.shortcuts import redirect from swh.web.browse.browseurls import browse_route from swh.web.common.utils import reverse from .utils.snapshot_context import ( browse_snapshot_directory, browse_snapshot_content, browse_snapshot_log, browse_snapshot_branches, browse_snapshot_releases ) @browse_route(r'snapshot/(?P[0-9a-f]+)/', view_name='browse-snapshot') def snapshot_browse(request, snapshot_id): - """Django view for browsing the content of a SWH snapshot. + """Django view for browsing the content of a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/` """ browse_snapshot_url = reverse('browse-snapshot-directory', url_args={'snapshot_id': snapshot_id}, query_params=request.GET) return redirect(browse_snapshot_url) @browse_route(r'snapshot/(?P[0-9a-f]+)/directory/', r'snapshot/(?P[0-9a-f]+)/directory/(?P.+)/', view_name='browse-snapshot-directory') def snapshot_directory_browse(request, snapshot_id, path=None): - """Django view for browsing the content of a SWH directory collected - in a SWH snapshot. + """Django view for browsing the content of a directory collected + in a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/directory/[(path)/]` """ # noqa origin_type = request.GET.get('origin_type', None) origin_url = request.GET.get('origin_url', None) if not origin_url: origin_url = request.GET.get('origin', None) return browse_snapshot_directory(request, snapshot_id=snapshot_id, path=path, origin_type=origin_type, origin_url=origin_url) @browse_route(r'snapshot/(?P[0-9a-f]+)/content/(?P.+)/', view_name='browse-snapshot-content') def snapshot_content_browse(request, snapshot_id, path): - """Django view that produces an HTML display of a SWH content - collected in a SWH snapshot. + """Django view that produces an HTML display of a content + collected in a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/content/(path)/` """ # noqa return browse_snapshot_content(request, snapshot_id=snapshot_id, path=path) @browse_route(r'snapshot/(?P[0-9a-f]+)/log/', view_name='browse-snapshot-log') def snapshot_log_browse(request, snapshot_id): """Django view that produces an HTML display of revisions history (aka - the commit log) collected in a SWH snapshot. + the commit log) collected in a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/log/` """ # noqa return browse_snapshot_log(request, snapshot_id=snapshot_id) @browse_route(r'snapshot/(?P[0-9a-f]+)/branches/', view_name='browse-snapshot-branches') def snapshot_branches_browse(request, snapshot_id): """Django view that produces an HTML display of the list of releases - collected in a SWH snapshot. + collected in a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/branches/` """ # noqa return browse_snapshot_branches(request, snapshot_id=snapshot_id) @browse_route(r'snapshot/(?P[0-9a-f]+)/releases/', view_name='browse-snapshot-releases') def snapshot_releases_browse(request, snapshot_id): """Django view that produces an HTML display of the list of releases - collected in a SWH snapshot. + collected in a snapshot. The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/releases/` """ # noqa return browse_snapshot_releases(request, snapshot_id=snapshot_id) diff --git a/swh/web/browse/views/utils/snapshot_context.py b/swh/web/browse/views/utils/snapshot_context.py index ffbf512d..cef89601 100644 --- a/swh/web/browse/views/utils/snapshot_context.py +++ b/swh/web/browse/views/utils/snapshot_context.py @@ -1,945 +1,945 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information -# Utility module implementing Django views for browsing the SWH archive +# Utility module implementing Django views for browsing the archive # in a snapshot context. # Its purpose is to factorize code for the views reachable from the # /origin/.* and /snapshot/.* endpoints. from django.shortcuts import render, redirect from django.template.defaultfilters import filesizeformat from swh.model.identifiers import snapshot_identifier from swh.web.browse.utils import ( get_snapshot_context, get_directory_entries, gen_directory_link, gen_revision_link, request_content, gen_content_link, prepare_content_for_display, content_display_max_size, format_log_entries, gen_revision_log_link, gen_link, get_readme_to_display, get_swh_persistent_ids, process_snapshot_branches ) from swh.web.common import service from swh.web.common.exc import ( handle_view_exception, NotFoundExc ) from swh.web.common.utils import ( reverse, gen_path_info, format_utc_iso_date, swh_object_icons ) _empty_snapshot_id = snapshot_identifier({'branches': {}}) def _get_branch(branches, branch_name, snapshot_id): """ Utility function to get a specific branch from a branches list. - Its purpose is to get the default HEAD branch as some SWH origin + Its purpose is to get the default HEAD branch as some software origin (e.g those with svn type) does not have it. In that latter case, check if there is a master branch instead and returns it. """ filtered_branches = \ [b for b in branches if b['name'].endswith(branch_name)] if len(filtered_branches) > 0: return filtered_branches[0] elif branch_name == 'HEAD': filtered_branches = \ [b for b in branches if b['name'].endswith('master')] if len(filtered_branches) > 0: return filtered_branches[0] elif len(branches) > 0: return branches[0] else: # case where a large branches list has been truncated snp_branch = service.lookup_snapshot(snapshot_id, branches_from=branch_name, branches_count=1, target_types=['revision']) snp_branch, _ = process_snapshot_branches(snp_branch['branches']) if snp_branch: branches.append(snp_branch[0]) return snp_branch[0] return None def _get_release(releases, release_name): """ Utility function to get a specific release from a releases list. Returns None if the release can not be found in the list. """ filtered_releases = \ [r for r in releases if r['name'] == release_name] if len(filtered_releases) > 0: return filtered_releases[0] else: return None def _branch_not_found(branch_type, branch, branches, snapshot_id=None, origin_info=None, timestamp=None, visit_id=None): """ Utility function to raise an exception when a specified branch/release can not be found. """ if branch_type == 'branch': branch_type = 'Branch' branch_type_plural = 'branches' else: branch_type = 'Release' branch_type_plural = 'releases' if snapshot_id and len(branches) == 0: msg = 'Snapshot with id %s has an empty list' \ ' of %s!' % (snapshot_id, branch_type_plural) elif snapshot_id: msg = '%s %s for snapshot with id %s' \ ' not found!' % (branch_type, branch, snapshot_id) elif visit_id and len(branches) == 0: msg = 'Origin with type %s and url %s' \ ' for visit with id %s has an empty list' \ ' of %s!' % (origin_info['type'], origin_info['url'], visit_id, branch_type_plural) elif visit_id: msg = '%s %s associated to visit with' \ ' id %s for origin with type %s and url %s' \ ' not found!' % (branch_type, branch, visit_id, origin_info['type'], origin_info['url']) elif len(branches) == 0: msg = 'Origin with type %s and url %s' \ ' for visit with timestamp %s has an empty list' \ ' of %s!' % (origin_info['type'], origin_info['url'], timestamp, branch_type_plural) else: msg = '%s %s associated to visit with' \ ' timestamp %s for origin with type %s' \ ' and url %s not found!' % (branch_type, branch, timestamp, origin_info['type'], origin_info['url']) raise NotFoundExc(msg) def _process_snapshot_request(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None, path=None, browse_context='directory'): """ Utility function to perform common input request processing for snapshot context views. """ visit_id = request.GET.get('visit_id', None) snapshot_context = get_snapshot_context(snapshot_id, origin_type, origin_url, timestamp, visit_id) swh_type = snapshot_context['swh_type'] origin_info = snapshot_context['origin_info'] branches = snapshot_context['branches'] releases = snapshot_context['releases'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] if snapshot_context['visit_info']: timestamp = format_utc_iso_date(snapshot_context['visit_info']['date'], '%Y-%m-%dT%H:%M:%SZ') snapshot_context['timestamp'] = \ format_utc_iso_date(snapshot_context['visit_info']['date']) browse_view_name = 'browse-' + swh_type + '-' + browse_context root_sha1_git = None revision_id = request.GET.get('revision', None) release_name = request.GET.get('release', None) release_id = None branch_name = None snapshot_total_size = sum(snapshot_context['snapshot_size'].values()) if snapshot_total_size and revision_id: revision = service.lookup_revision(revision_id) root_sha1_git = revision['directory'] branches.append({'name': revision_id, 'revision': revision_id, 'directory': root_sha1_git, 'url': None}) branch_name = revision_id query_params['revision'] = revision_id elif snapshot_total_size and release_name: release = _get_release(releases, release_name) try: root_sha1_git = release['directory'] revision_id = release['target'] release_id = release['id'] query_params['release'] = release_name except Exception: _branch_not_found("release", release_name, releases, snapshot_id, origin_info, timestamp, visit_id) elif snapshot_total_size: branch_name = request.GET.get('branch', None) if branch_name: query_params['branch'] = branch_name branch = _get_branch(branches, branch_name or 'HEAD', snapshot_context['snapshot_id']) try: branch_name = branch['name'] revision_id = branch['revision'] root_sha1_git = branch['directory'] except Exception: _branch_not_found("branch", branch_name, branches, snapshot_id, origin_info, timestamp, visit_id) for b in branches: branch_url_args = dict(url_args) branch_query_params = dict(query_params) if 'release' in branch_query_params: del branch_query_params['release'] branch_query_params['branch'] = b['name'] if path: b['path'] = path branch_url_args['path'] = path b['url'] = reverse(browse_view_name, url_args=branch_url_args, query_params=branch_query_params) for r in releases: release_url_args = dict(url_args) release_query_params = dict(query_params) if 'branch' in release_query_params: del release_query_params['branch'] release_query_params['release'] = r['name'] if path: r['path'] = path release_url_args['path'] = path r['url'] = reverse(browse_view_name, url_args=release_url_args, query_params=release_query_params) snapshot_context['query_params'] = query_params snapshot_context['root_sha1_git'] = root_sha1_git snapshot_context['revision_id'] = revision_id snapshot_context['branch'] = branch_name snapshot_context['release'] = release_name snapshot_context['release_id'] = release_id return snapshot_context def browse_snapshot_directory(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None, path=None): """ Django view implementation for browsing a directory in a snapshot context. """ try: snapshot_context = _process_snapshot_request(request, snapshot_id, origin_type, origin_url, timestamp, path, browse_context='directory') # noqa root_sha1_git = snapshot_context['root_sha1_git'] sha1_git = root_sha1_git if root_sha1_git and path: dir_info = service.lookup_directory_with_path(root_sha1_git, path) # some readme files can reference assets reachable from the # browsed directory, handle that special case in order to # correctly displayed them if dir_info and dir_info['type'] == 'file': file_raw_url = reverse( 'browse-content-raw', url_args={'query_string': dir_info['checksums']['sha1']}) return redirect(file_raw_url) sha1_git = dir_info['target'] dirs = [] files = [] if sha1_git: dirs, files = get_directory_entries(sha1_git) except Exception as exc: return handle_view_exception(request, exc) swh_type = snapshot_context['swh_type'] origin_info = snapshot_context['origin_info'] visit_info = snapshot_context['visit_info'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] revision_id = snapshot_context['revision_id'] snapshot_id = snapshot_context['snapshot_id'] path_info = gen_path_info(path) browse_view_name = 'browse-' + swh_type + '-directory' breadcrumbs = [] if root_sha1_git: breadcrumbs.append({'name': root_sha1_git[:7], 'url': reverse(browse_view_name, url_args=url_args, query_params=query_params)}) for pi in path_info: bc_url_args = dict(url_args) bc_url_args['path'] = pi['path'] breadcrumbs.append({'name': pi['name'], 'url': reverse(browse_view_name, url_args=bc_url_args, query_params=query_params)}) path = '' if path is None else (path + '/') for d in dirs: if d['type'] == 'rev': d['url'] = reverse('browse-revision', url_args={'sha1_git': d['target']}) else: bc_url_args = dict(url_args) bc_url_args['path'] = path + d['name'] d['url'] = reverse(browse_view_name, url_args=bc_url_args, query_params=query_params) sum_file_sizes = 0 readmes = {} browse_view_name = 'browse-' + swh_type + '-content' for f in files: bc_url_args = dict(url_args) bc_url_args['path'] = path + f['name'] f['url'] = reverse(browse_view_name, url_args=bc_url_args, query_params=query_params) if f['length'] is not None: sum_file_sizes += f['length'] f['length'] = filesizeformat(f['length']) if f['name'].lower().startswith('readme'): readmes[f['name']] = f['checksums']['sha1'] readme_name, readme_url, readme_html = get_readme_to_display(readmes) browse_view_name = 'browse-' + swh_type + '-log' history_url = None if snapshot_id != _empty_snapshot_id: history_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) nb_files = None nb_dirs = None sum_file_sizes = None dir_path = None if root_sha1_git: nb_files = len(files) nb_dirs = len(dirs) sum_file_sizes = filesizeformat(sum_file_sizes) dir_path = '/' + path browse_dir_link = \ gen_directory_link(sha1_git, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) browse_rev_link = \ gen_revision_link(revision_id, snapshot_context=snapshot_context, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) dir_metadata = {'id': sha1_git, 'context-independent directory': browse_dir_link, 'number of regular files': nb_files, 'number of subdirectories': nb_dirs, 'sum of regular file sizes': sum_file_sizes, 'path': dir_path, 'revision id': revision_id, 'revision': browse_rev_link, 'snapshot id': snapshot_id} if origin_info: dir_metadata['origin id'] = origin_info['id'] dir_metadata['origin type'] = origin_info['type'] dir_metadata['origin url'] = origin_info['url'] dir_metadata['origin visit date'] = format_utc_iso_date(visit_info['date']) # noqa dir_metadata['origin visit id'] = visit_info['visit'] snapshot_context_url = reverse('browse-snapshot-directory', url_args={'snapshot_id': snapshot_id}, query_params=request.GET) browse_snapshot_link = \ gen_link(snapshot_context_url, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) dir_metadata['snapshot context'] = browse_snapshot_link vault_cooking = { 'directory_context': True, 'directory_id': sha1_git, 'revision_context': True, 'revision_id': revision_id } swh_objects = [{'type': 'directory', 'id': sha1_git}, {'type': 'revision', 'id': revision_id}, {'type': 'snapshot', 'id': snapshot_id}] release_id = snapshot_context['release_id'] if release_id: swh_objects.append({'type': 'release', 'id': release_id}) swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) dir_path = '/'.join([bc['name'] for bc in breadcrumbs]) + '/' context_found = 'snapshot: %s' % snapshot_context['snapshot_id'] if origin_info: context_found = 'origin: %s' % origin_info['url'] heading = 'Directory - %s - %s - %s' %\ (dir_path, snapshot_context['branch'], context_found) return render(request, 'browse/directory.html', {'heading': heading, 'swh_object_name': 'Directory', 'swh_object_metadata': dir_metadata, 'dirs': dirs, 'files': files, 'breadcrumbs': breadcrumbs if root_sha1_git else [], 'top_right_link': { 'url': history_url, 'icon': swh_object_icons['revisions history'], 'text': 'History' }, 'readme_name': readme_name, 'readme_url': readme_url, 'readme_html': readme_html, 'snapshot_context': snapshot_context, 'vault_cooking': vault_cooking, 'show_actions_menu': True, 'swh_ids': swh_ids}) def browse_snapshot_content(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None, path=None): """ Django view implementation for browsing a content in a snapshot context. """ try: snapshot_context = _process_snapshot_request(request, snapshot_id, origin_type, origin_url, timestamp, path, browse_context='content') root_sha1_git = snapshot_context['root_sha1_git'] sha1_git = None query_string = None content_data = None if root_sha1_git: content_info = service.lookup_directory_with_path(root_sha1_git, path) sha1_git = content_info['target'] query_string = 'sha1_git:' + sha1_git content_data = request_content(query_string, raise_if_unavailable=False) except Exception as exc: return handle_view_exception(request, exc) swh_type = snapshot_context['swh_type'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] revision_id = snapshot_context['revision_id'] origin_info = snapshot_context['origin_info'] visit_info = snapshot_context['visit_info'] snapshot_id = snapshot_context['snapshot_id'] content = None language = None mimetype = None if content_data and content_data['raw_data'] is not None: content_display_data = prepare_content_for_display( content_data['raw_data'], content_data['mimetype'], path) content = content_display_data['content_data'] language = content_display_data['language'] mimetype = content_display_data['mimetype'] filename = None path_info = None browse_view_name = 'browse-' + swh_type + '-directory' breadcrumbs = [] split_path = path.split('/') filename = split_path[-1] path_info = gen_path_info(path[:-len(filename)]) if root_sha1_git: breadcrumbs.append({'name': root_sha1_git[:7], 'url': reverse(browse_view_name, url_args=url_args, query_params=query_params)}) for pi in path_info: bc_url_args = dict(url_args) bc_url_args['path'] = pi['path'] breadcrumbs.append({'name': pi['name'], 'url': reverse(browse_view_name, url_args=bc_url_args, query_params=query_params)}) breadcrumbs.append({'name': filename, 'url': None}) browse_content_link = \ gen_content_link(sha1_git, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) content_raw_url = None if query_string: content_raw_url = reverse('browse-content-raw', url_args={'query_string': query_string}, query_params={'filename': filename}) browse_rev_link = \ gen_revision_link(revision_id, snapshot_context=snapshot_context, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) content_metadata = { 'context-independent content': browse_content_link, 'path': None, 'filename': None, 'revision id': revision_id, 'revision': browse_rev_link, 'snapshot id': snapshot_id } cnt_sha1_git = None content_size = None error_code = 200 error_description = '' error_message = '' if content_data: content_metadata['sha1 checksum'] = \ content_data['checksums']['sha1'] content_metadata['sha1_git checksum'] = \ content_data['checksums']['sha1_git'] content_metadata['sha256 checksum'] = \ content_data['checksums']['sha256'] content_metadata['blake2s256 checksum'] = \ content_data['checksums']['blake2s256'] content_metadata['mime type'] = content_data['mimetype'] content_metadata['encoding'] = content_data['encoding'] content_metadata['size'] = filesizeformat(content_data['length']) content_metadata['language'] = content_data['language'] content_metadata['licenses'] = content_data['licenses'] content_metadata['path'] = '/' + path[:-len(filename)] content_metadata['filename'] = filename cnt_sha1_git = content_data['checksums']['sha1_git'] content_size = content_data['length'] error_code = content_data['error_code'] error_message = content_data['error_message'] error_description = content_data['error_description'] if origin_info: content_metadata['origin id'] = origin_info['id'] content_metadata['origin type'] = origin_info['type'] content_metadata['origin url'] = origin_info['url'] content_metadata['origin visit date'] = format_utc_iso_date(visit_info['date']) # noqa content_metadata['origin visit id'] = visit_info['visit'] browse_snapshot_url = reverse('browse-snapshot-content', url_args={'snapshot_id': snapshot_id, 'path': path}, query_params=request.GET) browse_snapshot_link = \ gen_link(browse_snapshot_url, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) content_metadata['snapshot context'] = browse_snapshot_link swh_objects = [{'type': 'content', 'id': cnt_sha1_git}, {'type': 'revision', 'id': revision_id}, {'type': 'snapshot', 'id': snapshot_id}] release_id = snapshot_context['release_id'] if release_id: swh_objects.append({'type': 'release', 'id': release_id}) swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) content_path = '/'.join([bc['name'] for bc in breadcrumbs]) context_found = 'snapshot: %s' % snapshot_context['snapshot_id'] if origin_info: context_found = 'origin: %s' % origin_info['url'] heading = 'Content - %s - %s - %s' %\ (content_path, snapshot_context['branch'], context_found) return render(request, 'browse/content.html', {'heading': heading, 'swh_object_name': 'Content', 'swh_object_metadata': content_metadata, 'content': content, 'content_size': content_size, 'max_content_size': content_display_max_size, 'mimetype': mimetype, 'language': language, 'breadcrumbs': breadcrumbs if root_sha1_git else [], 'top_right_link': { 'url': content_raw_url, 'icon': swh_object_icons['content'], 'text': 'Raw File' }, 'snapshot_context': snapshot_context, 'vault_cooking': None, 'show_actions_menu': True, 'swh_ids': swh_ids, 'error_code': error_code, 'error_message': error_message, 'error_description': error_description}, status=error_code) PER_PAGE = 100 def browse_snapshot_log(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None): """ Django view implementation for browsing a revision history in a snapshot context. """ try: snapshot_context = _process_snapshot_request(request, snapshot_id, origin_type, origin_url, timestamp, browse_context='log') # noqa revision_id = snapshot_context['revision_id'] per_page = int(request.GET.get('per_page', PER_PAGE)) offset = int(request.GET.get('offset', 0)) revs_ordering = request.GET.get('revs_ordering', 'committer_date') session_key = 'rev_%s_log_ordering_%s' % (revision_id, revs_ordering) rev_log_session = request.session.get(session_key, None) rev_log = [] revs_walker_state = None if rev_log_session: rev_log = rev_log_session['rev_log'] revs_walker_state = rev_log_session['revs_walker_state'] if len(rev_log) < offset+per_page: revs_walker = \ service.get_revisions_walker(revs_ordering, revision_id, max_revs=offset+per_page+1, state=revs_walker_state) rev_log += list(revs_walker) revs_walker_state = revs_walker.export_state() revision_log = rev_log[offset:offset+per_page] request.session[session_key] = { 'rev_log': rev_log, 'revs_walker_state': revs_walker_state } except Exception as exc: return handle_view_exception(request, exc) swh_type = snapshot_context['swh_type'] origin_info = snapshot_context['origin_info'] visit_info = snapshot_context['visit_info'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] snapshot_id = snapshot_context['snapshot_id'] query_params['per_page'] = per_page revs_ordering = request.GET.get('revs_ordering', '') query_params['revs_ordering'] = revs_ordering browse_view_name = 'browse-' + swh_type + '-log' prev_log_url = None if len(rev_log) > offset + per_page: query_params['offset'] = offset + per_page prev_log_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) next_log_url = None if offset != 0: query_params['offset'] = offset - per_page next_log_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) revision_log_data = format_log_entries(revision_log, per_page, snapshot_context) browse_log_link = \ gen_revision_log_link(revision_id, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) revision_metadata = { 'context-independent revision history': browse_log_link, 'snapshot id': snapshot_id } if origin_info: revision_metadata['origin id'] = origin_info['id'] revision_metadata['origin type'] = origin_info['type'] revision_metadata['origin url'] = origin_info['url'] revision_metadata['origin visit date'] = format_utc_iso_date(visit_info['date']) # noqa revision_metadata['origin visit id'] = visit_info['visit'] browse_snapshot_url = reverse('browse-snapshot-log', url_args={'snapshot_id': snapshot_id}, query_params=request.GET) browse_snapshot_link = \ gen_link(browse_snapshot_url, link_text='Browse', link_attrs={'class': 'btn btn-default btn-sm', 'role': 'button'}) revision_metadata['snapshot context'] = browse_snapshot_link swh_objects = [{'type': 'revision', 'id': revision_id}, {'type': 'snapshot', 'id': snapshot_id}] release_id = snapshot_context['release_id'] if release_id: swh_objects.append({'type': 'release', 'id': release_id}) swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) context_found = 'snapshot: %s' % snapshot_context['snapshot_id'] if origin_info: context_found = 'origin: %s' % origin_info['url'] heading = 'Revision history - %s - %s' %\ (snapshot_context['branch'], context_found) return render(request, 'browse/revision-log.html', {'heading': heading, 'swh_object_name': 'Revisions history', 'swh_object_metadata': revision_metadata, 'revision_log': revision_log_data, 'revs_ordering': revs_ordering, 'next_log_url': next_log_url, 'prev_log_url': prev_log_url, 'breadcrumbs': None, 'top_right_link': None, 'snapshot_context': snapshot_context, 'vault_cooking': None, 'show_actions_menu': True, 'swh_ids': swh_ids}) def browse_snapshot_branches(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None): """ Django view implementation for browsing a list of branches in a snapshot context. """ try: snapshot_context = _process_snapshot_request(request, snapshot_id, origin_type, origin_url, timestamp) branches_bc = request.GET.get('branches_breadcrumbs', '') branches_bc = \ branches_bc.split(',') if branches_bc else [] branches_from = branches_bc[-1] if branches_bc else '' swh_type = snapshot_context['swh_type'] origin_info = snapshot_context['origin_info'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] browse_view_name = 'browse-' + swh_type + '-directory' displayed_branches = \ service.lookup_snapshot(snapshot_context['snapshot_id'], branches_from, PER_PAGE+1, target_types=['revision'])['branches'] except Exception as exc: return handle_view_exception(request, exc) displayed_branches, _ = process_snapshot_branches(displayed_branches) for branch in displayed_branches: if snapshot_id: revision_url = reverse('browse-revision', url_args={'sha1_git': branch['revision']}, query_params={'snapshot_id': snapshot_id}) else: revision_url = reverse('browse-revision', url_args={'sha1_git': branch['revision']}, query_params={'origin_type': origin_type, 'origin': origin_info['url']}) query_params['branch'] = branch['name'] directory_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) del query_params['branch'] branch['revision_url'] = revision_url branch['directory_url'] = directory_url browse_view_name = 'browse-' + swh_type + '-branches' prev_branches_url = None next_branches_url = None if branches_bc: query_params_prev = dict(query_params) query_params_prev['branches_breadcrumbs'] = \ ','.join(branches_bc[:-1]) prev_branches_url = reverse(browse_view_name, url_args=url_args, query_params=query_params_prev) elif branches_from: prev_branches_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) if len(displayed_branches) > PER_PAGE: query_params_next = dict(query_params) next_branch = displayed_branches[-1]['name'] del displayed_branches[-1] branches_bc.append(next_branch) query_params_next['branches_breadcrumbs'] = \ ','.join(branches_bc) next_branches_url = reverse(browse_view_name, url_args=url_args, query_params=query_params_next) heading = 'Branches - ' if origin_info: heading += 'origin: %s' % origin_info['url'] else: heading += 'snapshot: %s' % snapshot_id return render(request, 'browse/branches.html', {'heading': heading, 'swh_object_name': 'Branches', 'swh_object_metadata': {}, 'top_right_link': None, 'displayed_branches': displayed_branches, 'prev_branches_url': prev_branches_url, 'next_branches_url': next_branches_url, 'snapshot_context': snapshot_context}) def browse_snapshot_releases(request, snapshot_id=None, origin_type=None, origin_url=None, timestamp=None): """ Django view implementation for browsing a list of releases in a snapshot context. """ try: snapshot_context = _process_snapshot_request(request, snapshot_id, origin_type, origin_url, timestamp) rel_bc = request.GET.get('releases_breadcrumbs', '') rel_bc = \ rel_bc.split(',') if rel_bc else [] rel_from = rel_bc[-1] if rel_bc else '' swh_type = snapshot_context['swh_type'] origin_info = snapshot_context['origin_info'] url_args = snapshot_context['url_args'] query_params = snapshot_context['query_params'] displayed_releases = \ service.lookup_snapshot(snapshot_context['snapshot_id'], rel_from, PER_PAGE+1, target_types=['release'])['branches'] except Exception as exc: return handle_view_exception(request, exc) _, displayed_releases = process_snapshot_branches(displayed_releases) for release in displayed_releases: if snapshot_id: query_params_tgt = {'snapshot_id': snapshot_id} else: query_params_tgt = {'origin': origin_info['url']} release_url = reverse('browse-release', url_args={'sha1_git': release['id']}, query_params=query_params_tgt) target_url = '' if release['target_type'] == 'revision': target_url = reverse('browse-revision', url_args={'sha1_git': release['target']}, query_params=query_params_tgt) elif release['target_type'] == 'directory': target_url = reverse('browse-directory', url_args={'sha1_git': release['target']}, query_params=query_params_tgt) elif release['target_type'] == 'content': target_url = reverse('browse-content', url_args={'sha1_git': release['target']}, query_params=query_params_tgt) elif release['target_type'] == 'release': target_url = reverse('browse-release', url_args={'sha1_git': release['target']}, query_params=query_params_tgt) release['release_url'] = release_url release['target_url'] = target_url browse_view_name = 'browse-' + swh_type + '-releases' prev_releases_url = None next_releases_url = None if rel_bc: query_params_prev = dict(query_params) query_params_prev['releases_breadcrumbs'] = \ ','.join(rel_bc[:-1]) prev_releases_url = reverse(browse_view_name, url_args=url_args, query_params=query_params_prev) elif rel_from: prev_releases_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) if len(displayed_releases) > PER_PAGE: query_params_next = dict(query_params) next_rel = displayed_releases[-1]['branch_name'] del displayed_releases[-1] rel_bc.append(next_rel) query_params_next['releases_breadcrumbs'] = \ ','.join(rel_bc) next_releases_url = reverse(browse_view_name, url_args=url_args, query_params=query_params_next) heading = 'Releases - ' if origin_info: heading += 'origin: %s' % origin_info['url'] else: heading += 'snapshot: %s' % snapshot_id return render(request, 'browse/releases.html', {'heading': heading, 'top_panel_visible': False, 'top_panel_collapsible': False, 'swh_object_name': 'Releases', 'swh_object_metadata': {}, 'top_right_link': None, 'displayed_releases': displayed_releases, 'prev_releases_url': prev_releases_url, 'next_releases_url': next_releases_url, 'snapshot_context': snapshot_context, 'vault_cooking': None, 'show_actions_menu': False}) diff --git a/swh/web/common/converters.py b/swh/web/common/converters.py index 0e988bdd..08d53e24 100644 --- a/swh/web/common/converters.py +++ b/swh/web/common/converters.py @@ -1,382 +1,382 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import datetime import json from swh.model import hashutil from swh.core.utils import decode_with_escape def _group_checksums(data): """Groups checksums values computed from hash functions used in swh and stored in data dict under a single entry 'checksums' """ if data: checksums = {} for hash in hashutil.ALGORITHMS: if hash in data and data[hash]: checksums[hash] = data[hash] del data[hash] if len(checksums) > 0: data['checksums'] = checksums def fmap(f, data): """Map f to data at each level. This must keep the origin data structure type: - map -> map - dict -> dict - list -> list - None -> None Args: f: function that expects one argument. data: data to traverse to apply the f function. list, map, dict or bare value. Returns: The same data-structure with modified values by the f function. """ if data is None: return data if isinstance(data, map): return map(lambda y: fmap(f, y), (x for x in data)) if isinstance(data, list): return [fmap(f, x) for x in data] if isinstance(data, dict): return {k: fmap(f, v) for (k, v) in data.items()} return f(data) def from_swh(dict_swh, hashess={}, bytess={}, dates={}, blacklist={}, removables_if_empty={}, empty_dict={}, empty_list={}, convert={}, convert_fn=lambda x: x): - """Convert from an swh dictionary to something reasonably json + """Convert from a swh dictionary to something reasonably json serializable. Args: dict_swh: the origin dictionary needed to be transformed hashess: list/set of keys representing hashes values (sha1, sha256, sha1_git, etc...) as bytes. Those need to be transformed in hexadecimal string bytess: list/set of keys representing bytes values which needs to be decoded blacklist: set of keys to filter out from the conversion convert: set of keys whose associated values need to be converted using convert_fn convert_fn: the conversion function to apply on the value of key in 'convert' The remaining keys are copied as is in the output. Returns: dictionary equivalent as dict_swh only with its keys converted. """ def convert_hashes_bytes(v): """v is supposedly a hash as bytes, returns it converted in hex. """ if isinstance(v, bytes): return hashutil.hash_to_hex(v) return v def convert_bytes(v): """v is supposedly a bytes string, decode as utf-8. FIXME: Improve decoding policy. If not utf-8, break! """ if isinstance(v, bytes): return v.decode('utf-8') return v def convert_date(v): """ Args: v (dict or datatime): either: - a dict with three keys: - timestamp (dict or integer timestamp) - offset - negative_utc - or, a datetime We convert it to a human-readable string """ if not v: return v if isinstance(v, datetime.datetime): return v.isoformat() tz = datetime.timezone(datetime.timedelta(minutes=v['offset'])) swh_timestamp = v['timestamp'] if isinstance(swh_timestamp, dict): date = datetime.datetime.fromtimestamp( swh_timestamp['seconds'], tz=tz) else: date = datetime.datetime.fromtimestamp( swh_timestamp, tz=tz) datestr = date.isoformat() if v['offset'] == 0 and v['negative_utc']: # remove the rightmost + and replace it with a - return '-'.join(datestr.rsplit('+', 1)) return datestr if not dict_swh: return dict_swh new_dict = {} for key, value in dict_swh.items(): if key in blacklist or (key in removables_if_empty and not value): continue if key in dates: new_dict[key] = convert_date(value) elif key in convert: new_dict[key] = convert_fn(value) elif isinstance(value, dict): new_dict[key] = from_swh(value, hashess=hashess, bytess=bytess, dates=dates, blacklist=blacklist, removables_if_empty=removables_if_empty, empty_dict=empty_dict, empty_list=empty_list, convert=convert, convert_fn=convert_fn) elif key in hashess: new_dict[key] = fmap(convert_hashes_bytes, value) elif key in bytess: try: new_dict[key] = fmap(convert_bytes, value) except UnicodeDecodeError: if 'decoding_failures' not in new_dict: new_dict['decoding_failures'] = [key] else: new_dict['decoding_failures'].append(key) new_dict[key] = fmap(decode_with_escape, value) elif key in empty_dict and not value: new_dict[key] = {} elif key in empty_list and not value: new_dict[key] = [] else: new_dict[key] = value _group_checksums(new_dict) return new_dict def from_provenance(provenance): - """Convert from a provenance information to a provenance dictionary. + """Convert from a swh provenance information to a provenance dictionary. Args: provenance (dict): Dictionary with the following keys: - content (sha1_git): the content's identifier - revision (sha1_git): the revision the content was seen - origin (int): the origin the content was seen - visit (int): the visit it occurred - path (bytes): the path the content was seen at """ return from_swh(provenance, hashess={'content', 'revision'}, bytess={'path'}) def from_origin(origin): - """Convert from an SWH origin to an origin dictionary. + """Convert from a swh origin to an origin dictionary. """ return from_swh(origin) def from_release(release): - """Convert from an SWH release to a json serializable release dictionary. + """Convert from a swh release to a json serializable release dictionary. Args: release (dict): dictionary with keys: - id: identifier of the revision (sha1 in bytes) - revision: identifier of the revision the release points to (sha1 in bytes) comment: release's comment message (bytes) name: release's name (string) author: release's author identifier (swh's id) synthetic: the synthetic property (boolean) Returns: dict: Release dictionary with the following keys: - id: hexadecimal sha1 (string) - revision: hexadecimal sha1 (string) - comment: release's comment message (string) - name: release's name (string) - author: release's author identifier (swh's id) - synthetic: the synthetic property (boolean) """ return from_swh( release, hashess={'id', 'target'}, bytess={'message', 'name', 'fullname', 'email'}, dates={'date'}, ) class SWHMetadataEncoder(json.JSONEncoder): """Special json encoder for metadata field which can contain bytes encoded value. """ def default(self, obj): if isinstance(obj, bytes): return obj.decode('utf-8') # Let the base class default method raise the TypeError return json.JSONEncoder.default(self, obj) def convert_revision_metadata(metadata): """Convert json specific dict to a json serializable one. """ if not metadata: return {} return json.loads(json.dumps(metadata, cls=SWHMetadataEncoder)) def from_revision(revision): - """Convert from an SWH revision to a json serializable revision dictionary. + """Convert from a swh revision to a json serializable revision dictionary. Args: revision (dict): dict with keys: - id: identifier of the revision (sha1 in bytes) - directory: identifier of the directory the revision points to (sha1 in bytes) - author_name, author_email: author's revision name and email - committer_name, committer_email: committer's revision name and email - message: revision's message - date, date_offset: revision's author date - committer_date, committer_date_offset: revision's commit date - parents: list of parents for such revision - synthetic: revision's property nature - type: revision's type (git, tar or dsc at the moment) - metadata: if the revision is synthetic, this can reference dynamic properties. Returns: dict: Revision dictionary with the same keys as inputs, except: - sha1s are in hexadecimal strings (id, directory) - bytes are decoded in string (author_name, committer_name, author_email, committer_email) Remaining keys are left as is """ revision = from_swh(revision, hashess={'id', 'directory', 'parents', 'children'}, bytess={'name', 'fullname', 'email'}, convert={'metadata'}, convert_fn=convert_revision_metadata, dates={'date', 'committer_date'}) if revision: if 'parents' in revision: revision['merge'] = len(revision['parents']) > 1 if 'message' in revision: try: revision['message'] = revision['message'].decode('utf-8') except UnicodeDecodeError: revision['message_decoding_failed'] = True revision['message'] = None return revision def from_content(content): """Convert swh content to serializable content dictionary. """ return from_swh(content, hashess={'sha1', 'sha1_git', 'sha256', 'blake2s256'}, blacklist={'ctime'}, convert={'status'}, convert_fn=lambda v: 'absent' if v == 'hidden' else v) def from_person(person): """Convert swh person to serializable person dictionary. """ return from_swh(person, bytess={'name', 'fullname', 'email'}) def from_origin_visit(visit): """Convert swh origin_visit to serializable origin_visit dictionary. """ ov = from_swh(visit, hashess={'target', 'snapshot'}, bytess={'branch'}, dates={'date'}, empty_dict={'metadata'}) return ov def from_snapshot(snapshot): """Convert swh snapshot to serializable snapshot dictionary. """ sv = from_swh(snapshot, hashess={'id', 'target'}, bytess={'next_branch'}) if sv and 'branches' in sv: sv['branches'] = { decode_with_escape(k): v for k, v in sv['branches'].items() } return sv def from_directory_entry(dir_entry): """Convert swh person to serializable person dictionary. """ return from_swh(dir_entry, hashess={'dir_id', 'sha1_git', 'sha1', 'sha256', 'blake2s256', 'target'}, bytess={'name'}, removables_if_empty={ 'sha1', 'sha1_git', 'sha256', 'blake2s256', 'status'}, convert={'status'}, convert_fn=lambda v: 'absent' if v == 'hidden' else v) def from_filetype(content_entry): """Convert swh person to serializable person dictionary. """ return from_swh(content_entry, hashess={'id'}, bytess={'mimetype', 'encoding'}) diff --git a/swh/web/common/origin_save.py b/swh/web/common/origin_save.py index 0434e3fe..2682f40a 100644 --- a/swh/web/common/origin_save.py +++ b/swh/web/common/origin_save.py @@ -1,354 +1,355 @@ # Copyright (C) 2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from bisect import bisect_right from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ValidationError from django.core.validators import URLValidator from swh.web import config from swh.web.common import service from swh.web.common.exc import BadInputExc, ForbiddenExc from swh.web.common.models import ( SaveUnauthorizedOrigin, SaveAuthorizedOrigin, SaveOriginRequest, SAVE_REQUEST_ACCEPTED, SAVE_REQUEST_REJECTED, SAVE_REQUEST_PENDING, SAVE_TASK_NOT_YET_SCHEDULED, SAVE_TASK_SCHEDULED, SAVE_TASK_SUCCEED, SAVE_TASK_FAILED ) from swh.web.common.utils import get_origin_visits, parse_timestamp from swh.scheduler.utils import create_oneshot_task_dict scheduler = config.scheduler() def get_origin_save_authorized_urls(): """ Get the list of origin url prefixes authorized to be immediately loaded into the archive (whitelist). Returns: list: The list of authorized origin url prefix """ return [origin.url for origin in SaveAuthorizedOrigin.objects.all()] def get_origin_save_unauthorized_urls(): """ Get the list of origin url prefixes forbidden to be loaded into the archive (blacklist). Returns: list: the list of unauthorized origin url prefix """ return [origin.url for origin in SaveUnauthorizedOrigin.objects.all()] def can_save_origin(origin_url): """ Check if a software origin can be saved into the archive. Based on the origin url, the save request will be either: * immediately accepted if the url is whitelisted * rejected if the url is blacklisted * put in pending state for manual review otherwise Args: origin_url (str): the software origin url to check Returns: - str: the origin save request status, either *accepted*, - *rejected* or *pending* + str: the origin save request status, either **accepted**, + **rejected** or **pending** """ # origin url may be blacklisted for url_prefix in get_origin_save_unauthorized_urls(): if origin_url.startswith(url_prefix): return SAVE_REQUEST_REJECTED # if the origin url is in the white list, it can be immediately saved for url_prefix in get_origin_save_authorized_urls(): if origin_url.startswith(url_prefix): return SAVE_REQUEST_ACCEPTED # otherwise, the origin url needs to be manually verified return SAVE_REQUEST_PENDING # map origin type to scheduler task # TODO: do not hardcode the task name here # TODO: unlock hg and svn loading once the scheduler # loading tasks are available in production _origin_type_task = { 'git': 'origin-update-git', # 'hg': 'origin-load-hg', # 'svn': 'origin-load-svn' } # map scheduler task status to origin save status _save_task_status = { 'next_run_not_scheduled': SAVE_TASK_NOT_YET_SCHEDULED, 'next_run_scheduled': SAVE_TASK_SCHEDULED, 'completed': SAVE_TASK_SUCCEED, 'disabled': SAVE_TASK_FAILED } def get_savable_origin_types(): return sorted(list(_origin_type_task.keys())) def _check_origin_type_savable(origin_type): """ Get the list of software origin types that can be loaded through a save request. Returns: - list: the list of savable origin types + list: the list of saveable origin types """ allowed_origin_types = ', '.join(get_savable_origin_types()) if origin_type not in _origin_type_task: raise BadInputExc('Origin of type %s can not be saved! ' 'Allowed types are the following: %s' % (origin_type, allowed_origin_types)) _validate_url = URLValidator(schemes=['http', 'https', 'svn', 'git']) def _check_origin_url_valid(origin_url): try: _validate_url(origin_url) except ValidationError: raise BadInputExc('The provided origin url (%s) is not valid!' % origin_url) def _get_visit_date_for_save_request(save_request): visit_date = None try: origin = {'type': save_request.origin_type, 'url': save_request.origin_url} origin_info = service.lookup_origin(origin) origin_visits = get_origin_visits(origin_info) visit_dates = [parse_timestamp(v['date']) for v in origin_visits] i = bisect_right(visit_dates, save_request.request_date) if i != len(visit_dates): visit_date = visit_dates[i] except Exception: pass return visit_date def _save_request_dict(save_request, task=None): must_save = False visit_date = save_request.visit_date if task: save_task_status = _save_task_status[task['status']] if save_task_status in (SAVE_TASK_FAILED, SAVE_TASK_SUCCEED) \ and not visit_date: visit_date = _get_visit_date_for_save_request(save_request) save_request.visit_date = visit_date must_save = True # Ensure last origin visit is available in database # before reporting the task execution as successful if save_task_status == SAVE_TASK_SUCCEED and not visit_date: save_task_status = SAVE_TASK_SCHEDULED if save_request.loading_task_status != save_task_status: save_request.loading_task_status = save_task_status must_save = True if must_save: save_request.save() else: save_task_status = save_request.loading_task_status return {'origin_type': save_request.origin_type, 'origin_url': save_request.origin_url, 'save_request_date': save_request.request_date.isoformat(), 'save_request_status': save_request.status, 'save_task_status': save_task_status, 'visit_date': visit_date.isoformat() if visit_date else None} def create_save_origin_request(origin_type, origin_url): """ Create a loading task to save a software origin into the archive. This function aims to create a software origin loading task trough the use of the swh-scheduler component. First, some checks are performed to see if the origin type and url are valid but also if the the save request can be accepted. If those checks passed, the loading task is then created. Otherwise, the save request is put in pending or rejected state. All the submitted save requests are logged into the swh-web database to keep track of them. Args: - origin_type (str): the type of origin to save (*git*, *hg*, *svn*, ...) + origin_type (str): the type of origin to save (currently only + ``git`` but ``svn`` and ``hg`` will soon be available) origin_url (str): the url of the origin to save Raises: BadInputExc: the origin type or url is invalid ForbiddenExc: the provided origin url is blacklisted Returns: dict: A dict describing the save request with the following keys: * **origin_type**: the type of the origin to save * **origin_url**: the url of the origin * **save_request_date**: the date the request was submitted - * **save_request_status**: the request status, either *accepted*, - *rejected* or *pending* + * **save_request_status**: the request status, either **accepted**, + **rejected** or **pending** * **save_task_status**: the origin loading task status, either - *not created*, *not yet scheduled*, *scheduled*, *succeed* or - *failed* + **not created**, **not yet scheduled**, **scheduled**, + **succeed** or **failed** """ _check_origin_type_savable(origin_type) _check_origin_url_valid(origin_url) save_request_status = can_save_origin(origin_url) task = None # if the origin save request is accepted, create a scheduler # task to load it into the archive if save_request_status == SAVE_REQUEST_ACCEPTED: # create a task with high priority kwargs = {'priority': 'high'} # set task parameters according to the origin type if origin_type == 'git': kwargs['repo_url'] = origin_url elif origin_type == 'hg': kwargs['origin_url'] = origin_url elif origin_type == 'svn': kwargs['origin_url'] = origin_url kwargs['svn_url'] = origin_url sor = None # get list of previously sumitted save requests current_sors = \ list(SaveOriginRequest.objects.filter(origin_type=origin_type, origin_url=origin_url)) can_create_task = False # if no save requests previously submitted, create the scheduler task if not current_sors: can_create_task = True else: # get the latest submitted save request sor = current_sors[0] # if it was in pending state, we need to create the scheduler task # and update the save request info in the database if sor.status == SAVE_REQUEST_PENDING: can_create_task = True # a task has already been created to load the origin elif sor.loading_task_id != -1: # get the scheduler task and its status tasks = scheduler.get_tasks([sor.loading_task_id]) task = tasks[0] if tasks else None task_status = _save_request_dict(sor, task)['save_task_status'] # create a new scheduler task only if the previous one has been # already executed if task_status == SAVE_TASK_FAILED or \ task_status == SAVE_TASK_SUCCEED: can_create_task = True sor = None else: can_create_task = False if can_create_task: # effectively create the scheduler task task_dict = create_oneshot_task_dict( _origin_type_task[origin_type], **kwargs) task = scheduler.create_tasks([task_dict])[0] # pending save request has been accepted if sor: sor.status = SAVE_REQUEST_ACCEPTED sor.loading_task_id = task['id'] sor.save() else: sor = SaveOriginRequest.objects.create(origin_type=origin_type, origin_url=origin_url, status=save_request_status, # noqa loading_task_id=task['id']) # noqa # save request must be manually reviewed for acceptation elif save_request_status == SAVE_REQUEST_PENDING: # check if there is already such a save request already submitted, # no need to add it to the database in that case try: sor = SaveOriginRequest.objects.get(origin_type=origin_type, origin_url=origin_url, status=save_request_status) # if not add it to the database except ObjectDoesNotExist: sor = SaveOriginRequest.objects.create(origin_type=origin_type, origin_url=origin_url, status=save_request_status) # origin can not be saved as its url is blacklisted, # log the request to the database anyway else: sor = SaveOriginRequest.objects.create(origin_type=origin_type, origin_url=origin_url, status=save_request_status) if save_request_status == SAVE_REQUEST_REJECTED: raise ForbiddenExc('The origin url is blacklisted and will not be ' 'loaded into the archive.') return _save_request_dict(sor, task) def get_save_origin_requests_from_queryset(requests_queryset): """ Get all save requests from a SaveOriginRequest queryset. Args: requests_queryset (django.db.models.QuerySet): input SaveOriginRequest queryset Returns: list: A list of save origin requests dict as described in :func:`swh.web.common.origin_save.create_save_origin_request` """ task_ids = [] for sor in requests_queryset: task_ids.append(sor.loading_task_id) tasks = scheduler.get_tasks(task_ids) tasks = {task['id']: task for task in tasks} requests = [] for sor in requests_queryset: sr_dict = _save_request_dict(sor, tasks.get(sor.loading_task_id, None)) requests.append(sr_dict) return requests def get_save_origin_requests(origin_type, origin_url): """ Get all save requests for a given software origin. Args: origin_type (str): the type of the origin origin_url (str): the url of the origin Raises: BadInputExc: the origin type or url is invalid Returns: list: A list of save origin requests dict as described in :func:`swh.web.common.origin_save.create_save_origin_request` """ _check_origin_type_savable(origin_type) _check_origin_url_valid(origin_url) sors = SaveOriginRequest.objects.filter(origin_type=origin_type, origin_url=origin_url) return get_save_origin_requests_from_queryset(sors) diff --git a/swh/web/common/service.py b/swh/web/common/service.py index ddcc7818..32597a5f 100644 --- a/swh/web/common/service.py +++ b/swh/web/common/service.py @@ -1,1029 +1,1029 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import os from collections import defaultdict from swh.model import hashutil from swh.storage.algos import revisions_walker from swh.web.common import converters from swh.web.common import query from swh.web.common.exc import NotFoundExc from swh.web import config storage = config.storage() vault = config.vault() idx_storage = config.indexer_storage() MAX_LIMIT = 50 # Top limit the users can ask for def _first_element(l): """Returns the first element in the provided list or None if it is empty or None""" return next(iter(l or []), None) def lookup_multiple_hashes(hashes): """Lookup the passed hashes in a single DB connection, using batch processing. Args: An array of {filename: X, sha1: Y}, string X, hex sha1 string Y. Returns: The same array with elements updated with elem['found'] = true if the hash is present in storage, elem['found'] = false if not. """ hashlist = [hashutil.hash_to_bytes(elem['sha1']) for elem in hashes] content_missing = storage.content_missing_per_sha1(hashlist) missing = [hashutil.hash_to_hex(x) for x in content_missing] for x in hashes: x.update({'found': True}) for h in hashes: if h['sha1'] in missing: h['found'] = False return hashes def lookup_expression(expression, last_sha1, per_page): """Lookup expression in raw content. Args: expression (str): An expression to lookup through raw indexed content last_sha1 (str): Last sha1 seen per_page (int): Number of results per page Returns: List of ctags whose content match the expression """ limit = min(per_page, MAX_LIMIT) ctags = idx_storage.content_ctags_search(expression, last_sha1=last_sha1, limit=limit) for ctag in ctags: ctag = converters.from_swh(ctag, hashess={'id'}) ctag['sha1'] = ctag['id'] ctag.pop('id') yield ctag def lookup_hash(q): """Checks if the storage contains a given content checksum Args: query string of the form Returns: Dict with key found containing the hash info if the hash is present, None if not. """ algo, hash = query.parse_hash(q) found = storage.content_find({algo: hash}) return {'found': found, 'algo': algo} def search_hash(q): """Checks if the storage contains a given content checksum Args: query string of the form Returns: Dict with key found to True or False, according to whether the checksum is present or not """ algo, hash = query.parse_hash(q) found = storage.content_find({algo: hash}) return {'found': found is not None} def lookup_content_provenance(q): """Return provenance information from a specified content. Args: q: query string of the form Yields: provenance information (dict) list if the content is found. """ algo, hash = query.parse_hash(q) provenances = storage.content_find_provenance({algo: hash}) if not provenances: return None return (converters.from_provenance(p) for p in provenances) def _lookup_content_sha1(q): """Given a possible input, query for the content's sha1. Args: q: query string of the form Returns: binary sha1 if found or None """ algo, hash = query.parse_hash(q) if algo != 'sha1': hashes = storage.content_find({algo: hash}) if not hashes: return None return hashes['sha1'] return hash def lookup_content_ctags(q): """Return ctags information from a specified content. Args: q: query string of the form Yields: ctags information (dict) list if the content is found. """ sha1 = _lookup_content_sha1(q) if not sha1: return None ctags = list(idx_storage.content_ctags_get([sha1])) if not ctags: return None for ctag in ctags: yield converters.from_swh(ctag, hashess={'id'}) def lookup_content_filetype(q): """Return filetype information from a specified content. Args: q: query string of the form Yields: filetype information (dict) list if the content is found. """ sha1 = _lookup_content_sha1(q) if not sha1: return None filetype = _first_element(list(idx_storage.content_mimetype_get([sha1]))) if not filetype: return None return converters.from_filetype(filetype) def lookup_content_language(q): """Return language information from a specified content. Args: q: query string of the form Yields: language information (dict) list if the content is found. """ sha1 = _lookup_content_sha1(q) if not sha1: return None lang = _first_element(list(idx_storage.content_language_get([sha1]))) if not lang: return None return converters.from_swh(lang, hashess={'id'}) def lookup_content_license(q): """Return license information from a specified content. Args: q: query string of the form Yields: license information (dict) list if the content is found. """ sha1 = _lookup_content_sha1(q) if not sha1: return None lic = _first_element(idx_storage.content_fossology_license_get([sha1])) if not lic: return None return converters.from_swh({'id': sha1, 'facts': lic[sha1]}, hashess={'id'}) def lookup_origin(origin): """Return information about the origin matching dict origin. Args: origin: origin's dict with keys either 'id' or ('type' AND 'url') Returns: origin information as dict. """ origin_info = storage.origin_get(origin) if not origin_info: if 'id' in origin and origin['id']: msg = 'Origin with id %s not found!' % origin['id'] else: msg = 'Origin with type %s and url %s not found!' % \ (origin['type'], origin['url']) raise NotFoundExc(msg) return converters.from_origin(origin_info) def search_origin(url_pattern, offset=0, limit=50, regexp=False, with_visit=False): """Search for origins whose urls contain a provided string pattern or match a provided regular expression. Args: url_pattern: the string pattern to search for in origin urls offset: number of found origins to skip before returning results limit: the maximum number of found origins to return Returns: list of origin information as dict. """ origins = storage.origin_search(url_pattern, offset, limit, regexp, with_visit) return map(converters.from_origin, origins) def lookup_person(person_id): """Return information about the person with id person_id. Args: person_id as string Returns: person information as dict. Raises: NotFoundExc if there is no person with the provided id. """ person = _first_element(storage.person_get([person_id])) if not person: raise NotFoundExc('Person with id %s not found' % person_id) return converters.from_person(person) def _to_sha1_bin(sha1_hex): _, sha1_git_bin = query.parse_hash_with_algorithms_or_throws( sha1_hex, ['sha1'], # HACK: sha1_git really 'Only sha1_git is supported.') return sha1_git_bin def lookup_directory(sha1_git): """Return information about the directory with id sha1_git. Args: sha1_git as string Returns: directory information as dict. """ empty_dir_sha1 = '4b825dc642cb6eb9a060e54bf8d69288fbee4904' if sha1_git == empty_dir_sha1: return [] sha1_git_bin = _to_sha1_bin(sha1_git) directory_entries = storage.directory_ls(sha1_git_bin) if directory_entries: return map(converters.from_directory_entry, directory_entries) else: raise NotFoundExc('Directory with sha1_git %s not found' % sha1_git) def lookup_directory_with_path(directory_sha1_git, path_string): """Return directory information for entry with path path_string w.r.t. root directory pointed by directory_sha1_git Args: - directory_sha1_git: sha1_git corresponding to the directory to which we append paths to (hopefully) find the entry - the relative path to the entry starting from the directory pointed by directory_sha1_git Raises: NotFoundExc if the directory entry is not found """ sha1_git_bin = _to_sha1_bin(directory_sha1_git) paths = path_string.strip(os.path.sep).split(os.path.sep) queried_dir = storage.directory_entry_get_by_path( sha1_git_bin, list(map(lambda p: p.encode('utf-8'), paths))) if not queried_dir: raise NotFoundExc(('Directory entry with path %s from %s not found') % (path_string, directory_sha1_git)) return converters.from_directory_entry(queried_dir) def lookup_release(release_sha1_git): """Return information about the release with sha1 release_sha1_git. Args: release_sha1_git: The release's sha1 as hexadecimal Returns: Release information as dict. Raises: ValueError if the identifier provided is not of sha1 nature. """ sha1_git_bin = _to_sha1_bin(release_sha1_git) release = _first_element(storage.release_get([sha1_git_bin])) if not release: raise NotFoundExc('Release with sha1_git %s not found.' % release_sha1_git) return converters.from_release(release) def lookup_release_multiple(sha1_git_list): """Return information about the revisions identified with their sha1_git identifiers. Args: sha1_git_list: A list of revision sha1_git identifiers Returns: Release information as dict. Raises: ValueError if the identifier provided is not of sha1 nature. """ sha1_bin_list = (_to_sha1_bin(sha1_git) for sha1_git in sha1_git_list) releases = storage.release_get(sha1_bin_list) or [] return (converters.from_release(r) for r in releases) def lookup_revision(rev_sha1_git): """Return information about the revision with sha1 revision_sha1_git. Args: revision_sha1_git: The revision's sha1 as hexadecimal Returns: Revision information as dict. Raises: ValueError if the identifier provided is not of sha1 nature. NotFoundExc if there is no revision with the provided sha1_git. """ sha1_git_bin = _to_sha1_bin(rev_sha1_git) revision = _first_element(storage.revision_get([sha1_git_bin])) if not revision: raise NotFoundExc('Revision with sha1_git %s not found.' % rev_sha1_git) return converters.from_revision(revision) def lookup_revision_multiple(sha1_git_list): """Return information about the revisions identified with their sha1_git identifiers. Args: sha1_git_list: A list of revision sha1_git identifiers Returns: Generator of revisions information as dict. Raises: ValueError if the identifier provided is not of sha1 nature. """ sha1_bin_list = (_to_sha1_bin(sha1_git) for sha1_git in sha1_git_list) revisions = storage.revision_get(sha1_bin_list) or [] return (converters.from_revision(r) for r in revisions) def lookup_revision_message(rev_sha1_git): """Return the raw message of the revision with sha1 revision_sha1_git. Args: revision_sha1_git: The revision's sha1 as hexadecimal Returns: Decoded revision message as dict {'message': } Raises: ValueError if the identifier provided is not of sha1 nature. NotFoundExc if the revision is not found, or if it has no message """ sha1_git_bin = _to_sha1_bin(rev_sha1_git) revision = _first_element(storage.revision_get([sha1_git_bin])) if not revision: raise NotFoundExc('Revision with sha1_git %s not found.' % rev_sha1_git) if 'message' not in revision: raise NotFoundExc('No message for revision with sha1_git %s.' % rev_sha1_git) res = {'message': revision['message']} return res def lookup_revision_by(origin_id, branch_name="refs/heads/master", timestamp=None): """Lookup revisions by origin_id, branch_name and timestamp. If: - branch_name is not provided, lookup using 'refs/heads/master' as default. - ts is not provided, use the most recent Args: - origin_id: origin of the revision. - branch_name: revision's branch. - timestamp: revision's time frame. Yields: The revisions matching the criterions. Raises: NotFoundExc if no revision corresponds to the criterion """ res = _first_element(storage.revision_get_by(origin_id, branch_name, timestamp=timestamp, limit=1)) if not res: raise NotFoundExc('Revision for origin %s and branch %s not found.' % (origin_id, branch_name)) return converters.from_revision(res) def lookup_revision_log(rev_sha1_git, limit): """Return information about the revision with sha1 revision_sha1_git. Args: revision_sha1_git: The revision's sha1 as hexadecimal limit: the maximum number of revisions returned Returns: Revision information as dict. Raises: ValueError if the identifier provided is not of sha1 nature. NotFoundExc if there is no revision with the provided sha1_git. """ sha1_git_bin = _to_sha1_bin(rev_sha1_git) revision_entries = storage.revision_log([sha1_git_bin], limit) if not revision_entries: raise NotFoundExc('Revision with sha1_git %s not found.' % rev_sha1_git) return map(converters.from_revision, revision_entries) def lookup_revision_log_by(origin_id, branch_name, timestamp, limit): """Return information about the revision with sha1 revision_sha1_git. Args: origin_id: origin of the revision branch_name: revision's branch timestamp: revision's time frame limit: the maximum number of revisions returned Returns: Revision information as dict. Raises: NotFoundExc if no revision corresponds to the criterion """ revision_entries = storage.revision_log_by(origin_id, branch_name, timestamp, limit=limit) if not revision_entries: return None return map(converters.from_revision, revision_entries) def lookup_revision_with_context_by(origin_id, branch_name, ts, sha1_git, limit=100): """Return information about revision sha1_git, limited to the sub-graph of all transitive parents of sha1_git_root. sha1_git_root being resolved through the lookup of a revision by origin_id, branch_name and ts. In other words, sha1_git is an ancestor of sha1_git_root. Args: - origin_id: origin of the revision. - branch_name: revision's branch. - timestamp: revision's time frame. - sha1_git: one of sha1_git_root's ancestors. - limit: limit the lookup to 100 revisions back. Returns: Pair of (root_revision, revision). Information on sha1_git if it is an ancestor of sha1_git_root including children leading to sha1_git_root Raises: - BadInputExc in case of unknown algo_hash or bad hash. - NotFoundExc if either revision is not found or if sha1_git is not an ancestor of sha1_git_root. """ rev_root = _first_element(storage.revision_get_by(origin_id, branch_name, timestamp=ts, limit=1)) if not rev_root: raise NotFoundExc('Revision with (origin_id: %s, branch_name: %s' ', ts: %s) not found.' % (origin_id, branch_name, ts)) return (converters.from_revision(rev_root), lookup_revision_with_context(rev_root, sha1_git, limit)) def lookup_revision_with_context(sha1_git_root, sha1_git, limit=100): """Return information about revision sha1_git, limited to the sub-graph of all transitive parents of sha1_git_root. In other words, sha1_git is an ancestor of sha1_git_root. Args: sha1_git_root: latest revision. The type is either a sha1 (as an hex string) or a non converted dict. sha1_git: one of sha1_git_root's ancestors limit: limit the lookup to 100 revisions back Returns: Information on sha1_git if it is an ancestor of sha1_git_root including children leading to sha1_git_root Raises: BadInputExc in case of unknown algo_hash or bad hash NotFoundExc if either revision is not found or if sha1_git is not an ancestor of sha1_git_root """ sha1_git_bin = _to_sha1_bin(sha1_git) revision = _first_element(storage.revision_get([sha1_git_bin])) if not revision: raise NotFoundExc('Revision %s not found' % sha1_git) if isinstance(sha1_git_root, str): sha1_git_root_bin = _to_sha1_bin(sha1_git_root) revision_root = _first_element(storage.revision_get([sha1_git_root_bin])) # noqa if not revision_root: raise NotFoundExc('Revision root %s not found' % sha1_git_root) else: sha1_git_root_bin = sha1_git_root['id'] revision_log = storage.revision_log([sha1_git_root_bin], limit) parents = {} children = defaultdict(list) for rev in revision_log: rev_id = rev['id'] parents[rev_id] = [] for parent_id in rev['parents']: parents[rev_id].append(parent_id) children[parent_id].append(rev_id) if revision['id'] not in parents: raise NotFoundExc('Revision %s is not an ancestor of %s' % (sha1_git, sha1_git_root)) revision['children'] = children[revision['id']] return converters.from_revision(revision) def lookup_directory_with_revision(sha1_git, dir_path=None, with_data=False): """Return information on directory pointed by revision with sha1_git. If dir_path is not provided, display top level directory. Otherwise, display the directory pointed by dir_path (if it exists). Args: sha1_git: revision's hash. dir_path: optional directory pointed to by that revision. with_data: boolean that indicates to retrieve the raw data if the path resolves to a content. Default to False (for the api) Returns: Information on the directory pointed to by that revision. Raises: BadInputExc in case of unknown algo_hash or bad hash. NotFoundExc either if the revision is not found or the path referenced does not exist. NotImplementedError in case of dir_path exists but do not reference a type 'dir' or 'file'. """ sha1_git_bin = _to_sha1_bin(sha1_git) revision = _first_element(storage.revision_get([sha1_git_bin])) if not revision: raise NotFoundExc('Revision %s not found' % sha1_git) dir_sha1_git_bin = revision['directory'] if dir_path: paths = dir_path.strip(os.path.sep).split(os.path.sep) entity = storage.directory_entry_get_by_path( dir_sha1_git_bin, list(map(lambda p: p.encode('utf-8'), paths))) if not entity: raise NotFoundExc( "Directory or File '%s' pointed to by revision %s not found" % (dir_path, sha1_git)) else: entity = {'type': 'dir', 'target': dir_sha1_git_bin} if entity['type'] == 'dir': directory_entries = storage.directory_ls(entity['target']) or [] return {'type': 'dir', 'path': '.' if not dir_path else dir_path, 'revision': sha1_git, 'content': map(converters.from_directory_entry, directory_entries)} elif entity['type'] == 'file': # content content = storage.content_find({'sha1_git': entity['target']}) if with_data: c = _first_element(storage.content_get([content['sha1']])) content['data'] = c['data'] return {'type': 'file', 'path': '.' if not dir_path else dir_path, 'revision': sha1_git, 'content': converters.from_content(content)} else: raise NotImplementedError('Entity of type %s not implemented.' % entity['type']) def lookup_content(q): """Lookup the content designed by q. Args: q: The release's sha1 as hexadecimal Raises: NotFoundExc if the requested content is not found """ algo, hash = query.parse_hash(q) c = storage.content_find({algo: hash}) if not c: raise NotFoundExc('Content with %s checksum equals to %s not found!' % (algo, hashutil.hash_to_hex(hash))) return converters.from_content(c) def lookup_content_raw(q): """Lookup the content defined by q. Args: q: query string of the form Returns: dict with 'sha1' and 'data' keys. data representing its raw data decoded. Raises: NotFoundExc if the requested content is not found or if the content bytes are not available in the storage """ c = lookup_content(q) content = _first_element(storage.content_get([c['checksums']['sha1']])) if not content: algo, hash = query.parse_hash(q) raise NotFoundExc('Bytes of content with %s checksum equals to %s ' 'are not available!' % (algo, hashutil.hash_to_hex(hash))) return converters.from_content(content) def stat_counters(): """Return the stat counters for Software Heritage Returns: A dict mapping textual labels to integer values. """ return storage.stat_counters() def _lookup_origin_visits(origin_id, last_visit=None, limit=10): """Yields the origin origin_ids' visits. Args: origin_id (int): origin to list visits for last_visit (int): last visit to lookup from limit (int): Number of elements max to display Yields: Dictionaries of origin_visit for that origin """ limit = min(limit, MAX_LIMIT) yield from storage.origin_visit_get( origin_id, last_visit=last_visit, limit=limit) def lookup_origin_visits(origin_id, last_visit=None, per_page=10): """Yields the origin origin_ids' visits. Args: origin_id: origin to list visits for Yields: Dictionaries of origin_visit for that origin """ visits = _lookup_origin_visits(origin_id, last_visit=last_visit, limit=per_page) for visit in visits: yield converters.from_origin_visit(visit) def lookup_origin_visit(origin_id, visit_id): """Return information about visit visit_id with origin origin_id. Args: origin_id: origin concerned by the visit visit_id: the visit identifier to lookup Yields: The dict origin_visit concerned """ visit = storage.origin_visit_get_by(origin_id, visit_id) if not visit: raise NotFoundExc('Origin with id %s or its visit ' 'with id %s not found!' % (origin_id, visit_id)) return converters.from_origin_visit(visit) def lookup_snapshot_size(snapshot_id): """Count the number of branches in the snapshot with the given id Args: snapshot_id (str): sha1 identifier of the snapshot Returns: dict: A dict whose keys are the target types of branches and values their corresponding amount """ snapshot_id_bin = _to_sha1_bin(snapshot_id) snapshot_size = storage.snapshot_count_branches(snapshot_id_bin) if 'revision' not in snapshot_size: snapshot_size['revision'] = 0 if 'release' not in snapshot_size: snapshot_size['release'] = 0 return snapshot_size def lookup_snapshot(snapshot_id, branches_from='', branches_count=None, target_types=None): """Return information about a snapshot, aka the list of named branches found during a specific visit of an origin. Args: snapshot_id (str): sha1 identifier of the snapshot branches_from (str): optional parameter used to skip branches whose name is lesser than it before returning them branches_count (int): optional parameter used to restrain the amount of returned branches target_types (list): optional parameter used to filter the target types of branch to return (possible values that can be contained in that list are `'content', 'directory', 'revision', 'release', 'snapshot', 'alias'`) Returns: A dict filled with the snapshot content. """ snapshot_id_bin = _to_sha1_bin(snapshot_id) snapshot = storage.snapshot_get_branches(snapshot_id_bin, branches_from.encode(), branches_count, target_types) if not snapshot: raise NotFoundExc('Snapshot with id %s not found!' % snapshot_id) return converters.from_snapshot(snapshot) def lookup_latest_origin_snapshot(origin_id, allowed_statuses=None): """Return information about the latest snapshot of an origin. .. warning:: At most 1000 branches contained in the snapshot will be returned for performance reasons. Args: origin_id: integer identifier of the origin allowed_statuses: list of visit statuses considered to find the latest snapshot for the visit. For instance, ``allowed_statuses=['full']`` will only consider visits that have successfully run to completion. Returns: A dict filled with the snapshot content. """ snapshot = storage.snapshot_get_latest(origin_id, allowed_statuses) return converters.from_snapshot(snapshot) def lookup_entity_by_uuid(uuid): """Return the entity's hierarchy from its uuid. Args: uuid: entity's identifier. Returns: List of hierarchy entities from the entity with uuid. """ uuid = query.parse_uuid4(uuid) for entity in storage.entity_get(uuid): entity = converters.from_swh(entity, convert={'last_seen', 'uuid'}, convert_fn=lambda x: str(x)) yield entity def lookup_revision_through(revision, limit=100): """Retrieve a revision from the criterion stored in revision dictionary. Args: revision: Dictionary of criterion to lookup the revision with. Here are the supported combination of possible values: - origin_id, branch_name, ts, sha1_git - origin_id, branch_name, ts - sha1_git_root, sha1_git - sha1_git Returns: None if the revision is not found or the actual revision. """ if 'origin_id' in revision and \ 'branch_name' in revision and \ 'ts' in revision and \ 'sha1_git' in revision: return lookup_revision_with_context_by(revision['origin_id'], revision['branch_name'], revision['ts'], revision['sha1_git'], limit) if 'origin_id' in revision and \ 'branch_name' in revision and \ 'ts' in revision: return lookup_revision_by(revision['origin_id'], revision['branch_name'], revision['ts']) if 'sha1_git_root' in revision and \ 'sha1_git' in revision: return lookup_revision_with_context(revision['sha1_git_root'], revision['sha1_git'], limit) if 'sha1_git' in revision: return lookup_revision(revision['sha1_git']) # this should not happen raise NotImplementedError('Should not happen!') def lookup_directory_through_revision(revision, path=None, limit=100, with_data=False): """Retrieve the directory information from the revision. Args: revision: dictionary of criterion representing a revision to lookup path: directory's path to lookup. limit: optional query parameter to limit the revisions log (default to 100). For now, note that this limit could impede the transitivity conclusion about sha1_git not being an ancestor of. with_data: indicate to retrieve the content's raw data if path resolves to a content. Returns: The directory pointing to by the revision criterions at path. """ rev = lookup_revision_through(revision, limit) if not rev: raise NotFoundExc('Revision with criterion %s not found!' % revision) return (rev['id'], lookup_directory_with_revision(rev['id'], path, with_data)) def vault_cook(obj_type, obj_id, email=None): """Cook a vault bundle. """ return vault.cook(obj_type, obj_id, email=email) def vault_fetch(obj_type, obj_id): """Fetch a vault bundle. """ return vault.fetch(obj_type, obj_id) def vault_progress(obj_type, obj_id): """Get the current progress of a vault bundle. """ return vault.progress(obj_type, obj_id) def diff_revision(rev_id): """Get the list of file changes (insertion / deletion / modification / renaming) for a particular revision. """ rev_sha1_git_bin = _to_sha1_bin(rev_id) changes = storage.diff_revision(rev_sha1_git_bin, track_renaming=True) for change in changes: change['from'] = converters.from_directory_entry(change['from']) change['to'] = converters.from_directory_entry(change['to']) if change['from_path']: change['from_path'] = change['from_path'].decode('utf-8') if change['to_path']: change['to_path'] = change['to_path'].decode('utf-8') return changes class _RevisionsWalkerProxy(object): """ Proxy class wrapping a revisions walker iterator from swh-storage and performing needed conversions. """ def __init__(self, rev_walker_type, rev_start, *args, **kwargs): rev_start_bin = hashutil.hash_to_bytes(rev_start) self.revisions_walker = \ revisions_walker.get_revisions_walker(rev_walker_type, storage, rev_start_bin, *args, **kwargs) def export_state(self): return self.revisions_walker.export_state() def __next__(self): return converters.from_revision(next(self.revisions_walker)) def __iter__(self): return self def get_revisions_walker(rev_walker_type, rev_start, *args, **kwargs): """ Utility function to instantiate a revisions walker of a given type, see :mod:`swh.storage.algos.revisions_walker`. Args: rev_walker_type (str): the type of revisions walker to return, - possible values are: *committer_date*, *dfs*, *dfs_post*, - *bfs* and *path* + possible values are: ``committer_date``, ``dfs``, ``dfs_post``, + ``bfs`` and ``path`` rev_start (str): hexadecimal representation of a revision identifier args (list): position arguments to pass to the revisions walker constructor kwargs (dict): keyword arguments to pass to the revisions walker constructor """ # first check if the provided revision is valid lookup_revision(rev_start) return _RevisionsWalkerProxy(rev_walker_type, rev_start, *args, **kwargs) diff --git a/swh/web/common/utils.py b/swh/web/common/utils.py index 8d800999..a9336bfc 100644 --- a/swh/web/common/utils.py +++ b/swh/web/common/utils.py @@ -1,412 +1,413 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import docutils.parsers.rst import docutils.utils import re import requests from datetime import datetime, timezone from dateutil import parser as date_parser from dateutil import tz from django.core.cache import cache from django.urls import reverse as django_reverse from django.http import QueryDict from swh.model.exceptions import ValidationError from swh.model.identifiers import ( persistent_identifier, parse_persistent_identifier, CONTENT, DIRECTORY, RELEASE, REVISION, SNAPSHOT ) from swh.web.common import service from swh.web.common.exc import BadInputExc from swh.web.config import get_config swh_object_icons = { 'branch': 'fa fa-code-fork', 'branches': 'fa fa-code-fork', 'content': 'fa fa-file-text', 'directory': 'fa fa-folder', 'person': 'fa fa-user', 'revisions history': 'fa fa-history', 'release': 'fa fa-tag', 'releases': 'fa fa-tag', 'revision': 'octicon octicon-git-commit', 'snapshot': 'fa fa-camera', 'visits': 'fa fa-calendar', } def reverse(viewname, url_args=None, query_params=None, current_app=None, urlconf=None): """An override of django reverse function supporting query parameters. Args: viewname (str): the name of the django view from which to compute a url url_args (dict): dictionary of url arguments indexed by their names query_params (dict): dictionary of query parameters to append to the reversed url current_app (str): the name of the django app tighten to the view urlconf (str): url configuration module Returns: str: the url of the requested view with processed arguments and query parameters """ if url_args: url_args = {k: v for k, v in url_args.items() if v is not None} url = django_reverse(viewname, urlconf=urlconf, kwargs=url_args, current_app=current_app) if query_params: query_params = {k: v for k, v in query_params.items() if v} if query_params and len(query_params) > 0: query_dict = QueryDict('', mutable=True) for k in sorted(query_params.keys()): query_dict[k] = query_params[k] url += ('?' + query_dict.urlencode(safe='/;:')) return url def datetime_to_utc(date): """Returns datetime in UTC without timezone info Args: date (datetime.datetime): input datetime with timezone info Returns: datetime.datetime: datetime in UTC without timezone info """ if date.tzinfo: return date.astimezone(tz.gettz('UTC')).replace(tzinfo=timezone.utc) else: return date def parse_timestamp(timestamp): """Given a time or timestamp (as string), parse the result as UTC datetime. Returns: datetime.datetime: a timezone-aware datetime representing the parsed value or None if the parsing fails. Samples: - 2016-01-12 - 2016-01-12T09:19:12+0100 - Today is January 1, 2047 at 8:21:00AM - 1452591542 """ if not timestamp: return None try: date = date_parser.parse(timestamp, ignoretz=False, fuzzy=True) return datetime_to_utc(date) except Exception: try: return datetime.utcfromtimestamp(float(timestamp)).replace( tzinfo=timezone.utc) except (ValueError, OverflowError) as e: raise BadInputExc(e) def shorten_path(path): """Shorten the given path: for each hash present, only return the first 8 characters followed by an ellipsis""" sha256_re = r'([0-9a-f]{8})[0-9a-z]{56}' sha1_re = r'([0-9a-f]{8})[0-9a-f]{32}' ret = re.sub(sha256_re, r'\1...', path) return re.sub(sha1_re, r'\1...', ret) def format_utc_iso_date(iso_date, fmt='%d %B %Y, %H:%M UTC'): """Turns a string representation of an ISO 8601 date string to UTC and format it into a more human readable one. For instance, from the following input string: '2017-05-04T13:27:13+02:00' the following one is returned: '04 May 2017, 11:27 UTC'. Custom format string may also be provided as parameter Args: iso_date (str): a string representation of an ISO 8601 date fmt (str): optional date formatting string Returns: str: a formatted string representation of the input iso date """ if not iso_date: return iso_date date = parse_timestamp(iso_date) return date.strftime(fmt) def gen_path_info(path): """Function to generate path data navigation for use with a breadcrumb in the swh web ui. For instance, from a path /folder1/folder2/folder3, it returns the following list:: [{'name': 'folder1', 'path': 'folder1'}, {'name': 'folder2', 'path': 'folder1/folder2'}, {'name': 'folder3', 'path': 'folder1/folder2/folder3'}] Args: path: a filesystem path Returns: list: a list of path data for navigation as illustrated above. """ path_info = [] if path: sub_paths = path.strip('/').split('/') path_from_root = '' for p in sub_paths: path_from_root += '/' + p path_info.append({'name': p, 'path': path_from_root.strip('/')}) return path_info def get_origin_visits(origin_info): """Function that returns the list of visits for a swh origin. That list is put in cache in order to speedup the navigation in the swh web browse ui. Args: origin_id (int): the id of the swh origin to fetch visits from Returns: list: A list of dict describing the origin visits with the following keys: * **date**: UTC visit date in ISO format, * **origin**: the origin id - * **status**: the visit status, either *full* or *partial* + * **status**: the visit status, either **full**, **partial** + or **ongoing** * **visit**: the visit id Raises: NotFoundExc: if the origin is not found """ cache_entry_id = 'origin_%s_visits' % origin_info['id'] cache_entry = cache.get(cache_entry_id) last_snapshot = service.lookup_latest_origin_snapshot(origin_info['id']) if cache_entry and \ (not last_snapshot or last_snapshot['id'] == cache_entry[-1]['snapshot']): return cache_entry origin_visits = [] per_page = service.MAX_LIMIT last_visit = None while 1: visits = list(service.lookup_origin_visits(origin_info['id'], last_visit=last_visit, per_page=per_page)) origin_visits += visits if len(visits) < per_page: break else: if not last_visit: last_visit = per_page else: last_visit += per_page def _visit_sort_key(visit): ts = parse_timestamp(visit['date']).timestamp() return ts + (float(visit['visit']) / 10e3) for v in origin_visits: if 'metadata' in v: del v['metadata'] origin_visits = [dict(t) for t in set([tuple(d.items()) for d in origin_visits])] origin_visits = sorted(origin_visits, key=lambda v: _visit_sort_key(v)) cache.set(cache_entry_id, origin_visits) return origin_visits def get_swh_persistent_id(object_type, object_id, scheme_version=1): """ Returns the persistent identifier for a swh object based on: * the object type * the object id * the swh identifiers scheme version Args: object_type (str): the swh object type (content/directory/release/revision/snapshot) object_id (str): the swh object id (hexadecimal representation of its hash value) scheme_version (int): the scheme version of the swh persistent identifiers Returns: str: the swh object persistent identifier Raises: BadInputExc: if the provided parameters do not enable to generate a valid identifier """ try: swh_id = persistent_identifier(object_type, object_id, scheme_version) except ValidationError as e: raise BadInputExc('Invalid object (%s) for swh persistent id. %s' % (object_id, e)) else: return swh_id def resolve_swh_persistent_id(swh_id, query_params=None): """ - Try to resolve a SWH persistent id into an url for + Try to resolve a Software Heritage persistent id into an url for browsing the pointed object. Args: - swh_id (str): a SWH persistent identifier + swh_id (str): a Software Heritage persistent identifier query_params (django.http.QueryDict): optional dict filled with query parameters to append to the browse url Returns: dict: a dict with the following keys: * **swh_id_parsed (swh.model.identifiers.PersistentId)**: the parsed identifier * **browse_url (str)**: the url for browsing the pointed object Raises: BadInputExc: if the provided identifier can not be parsed """ # noqa try: swh_id_parsed = parse_persistent_identifier(swh_id) object_type = swh_id_parsed.object_type object_id = swh_id_parsed.object_id browse_url = None query_dict = QueryDict('', mutable=True) if query_params and len(query_params) > 0: for k in sorted(query_params.keys()): query_dict[k] = query_params[k] if 'origin' in swh_id_parsed.metadata: query_dict['origin'] = swh_id_parsed.metadata['origin'] if object_type == CONTENT: query_string = 'sha1_git:' + object_id fragment = '' if 'lines' in swh_id_parsed.metadata: lines = swh_id_parsed.metadata['lines'].split('-') fragment += '#L' + lines[0] if len(lines) > 1: fragment += '-L' + lines[1] browse_url = reverse('browse-content', url_args={'query_string': query_string}, query_params=query_dict) + fragment elif object_type == DIRECTORY: browse_url = reverse('browse-directory', url_args={'sha1_git': object_id}, query_params=query_dict) elif object_type == RELEASE: browse_url = reverse('browse-release', url_args={'sha1_git': object_id}, query_params=query_dict) elif object_type == REVISION: browse_url = reverse('browse-revision', url_args={'sha1_git': object_id}, query_params=query_dict) elif object_type == SNAPSHOT: browse_url = reverse('browse-snapshot', url_args={'snapshot_id': object_id}, query_params=query_dict) except ValidationError as ve: raise BadInputExc('Error when parsing identifier. %s' % ' '.join(ve.messages)) else: return {'swh_id_parsed': swh_id_parsed, 'browse_url': browse_url} def parse_rst(text, report_level=2): """ Parse a reStructuredText string with docutils. Args: text (str): string with reStructuredText markups in it report_level (int): level of docutils report messages to print (1 info 2 warning 3 error 4 severe 5 none) Returns: docutils.nodes.document: a parsed docutils document """ parser = docutils.parsers.rst.Parser() components = (docutils.parsers.rst.Parser,) settings = docutils.frontend.OptionParser( components=components).get_default_values() settings.report_level = report_level document = docutils.utils.new_document('rst-doc', settings=settings) parser.parse(text, document) return document def get_client_ip(request): """ Return the client IP address from an incoming HTTP request. Args: request (django.http.HttpRequest): the incoming HTTP request Returns: str: The client IP address """ x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip def is_recaptcha_valid(request, recaptcha_response): """ Verify if the response for Google reCAPTCHA is valid. Args: request (django.http.HttpRequest): the incoming HTTP request recaptcha_response (str): the reCAPTCHA response Returns: - bool: Wether the reCAPTCHA response is valid or not + bool: Whether the reCAPTCHA response is valid or not """ config = get_config() return requests.post( config['grecaptcha']['validation_url'], data={ 'secret': config['grecaptcha']['private_key'], 'response': recaptcha_response, 'remoteip': get_client_ip(request) }, verify=True ).json().get("success", False) def context_processor(request): """ Django context processor used to inject variables in all swh-web templates. """ return {'swh_object_icons': swh_object_icons} diff --git a/swh/web/config.py b/swh/web/config.py index 2f0b40f5..1c1199ae 100644 --- a/swh/web/config.py +++ b/swh/web/config.py @@ -1,130 +1,130 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.core import config from swh.storage import get_storage from swh.indexer.storage import get_indexer_storage from swh.vault.api.client import RemoteVaultClient from swh.scheduler import get_scheduler DEFAULT_CONFIG = { 'allowed_hosts': ('list', []), 'storage': ('dict', { 'cls': 'remote', 'args': { 'url': 'http://127.0.0.1:5002/', 'timeout': 10, }, }), 'indexer_storage': ('dict', { 'cls': 'remote', 'args': { 'url': 'http://127.0.0.1:5007/', 'timeout': 1, } }), 'vault': ('string', 'http://127.0.0.1:5005/'), 'log_dir': ('string', '/tmp/swh/log'), 'debug': ('bool', False), 'serve_assets': ('bool', False), 'host': ('string', '127.0.0.1'), 'port': ('int', 5004), 'secret_key': ('string', 'development key'), # do not display code highlighting for content > 1MB 'content_display_max_size': ('int', 1024 * 1024), 'snapshot_content_max_size': ('int', 1000), 'throttling': ('dict', { 'cache_uri': None, # production: memcached as cache (127.0.0.1:11211) # development: in-memory cache so None 'scopes': { 'swh_api': { 'limiter_rate': { 'default': '120/h' }, 'exempted_networks': ['127.0.0.0/8'] }, 'swh_vault_cooking': { 'limiter_rate': { 'default': '120/h', 'GET': '60/m' }, 'exempted_networks': ['127.0.0.0/8'] }, 'swh_save_origin': { 'limiter_rate': { 'default': '120/h', 'POST': '10/h' }, 'exempted_networks': ['127.0.0.0/8'] } } }), 'scheduler': ('dict', { 'cls': 'remote', 'args': { 'url': 'http://localhost:5008/' } }), 'grecaptcha': ('dict', { 'validation_url': 'https://www.google.com/recaptcha/api/siteverify', 'site_key': '', 'private_key': '' }), 'production_db': ('string', '/var/lib/swh/web.sqlite3'), 'deposit': ('dict', { 'private_api_url': 'https://deposit.softwareheritage.org/1/private/', 'private_api_user': 'swhworker', 'private_api_password': '' }) } swhweb_config = {} def get_config(config_file='web/web'): """Read the configuration file `config_file`, update the app with parameters (secret_key, conf) and return the parsed configuration as a dict. If no configuration file is provided, return a default configuration.""" if not swhweb_config: cfg = config.load_named_config(config_file, DEFAULT_CONFIG) swhweb_config.update(cfg) config.prepare_folders(swhweb_config, 'log_dir') swhweb_config['storage'] = get_storage(**swhweb_config['storage']) swhweb_config['vault'] = RemoteVaultClient(swhweb_config['vault']) swhweb_config['indexer_storage'] = \ get_indexer_storage(**swhweb_config['indexer_storage']) swhweb_config['scheduler'] = get_scheduler(**swhweb_config['scheduler']) # noqa return swhweb_config def storage(): - """Return the current application's SWH storage. + """Return the current application's storage. """ return get_config()['storage'] def vault(): - """Return the current application's SWH vault. + """Return the current application's vault. """ return get_config()['vault'] def indexer_storage(): - """Return the current application's SWH indexer storage. + """Return the current application's indexer storage. """ return get_config()['indexer_storage'] def scheduler(): - """Return the current application's SWH scheduler. + """Return the current application's scheduler. """ return get_config()['scheduler'] diff --git a/swh/web/static/css/origin.245751215322daa84934.css b/swh/web/static/css/origin.6b57666194b71082b679.css similarity index 100% rename from swh/web/static/css/origin.245751215322daa84934.css rename to swh/web/static/css/origin.6b57666194b71082b679.css diff --git a/swh/web/static/css/origin.245751215322daa84934.css.map b/swh/web/static/css/origin.6b57666194b71082b679.css.map similarity index 98% rename from swh/web/static/css/origin.245751215322daa84934.css.map rename to swh/web/static/css/origin.6b57666194b71082b679.css.map index 7b94e1df..2253fb7e 100644 --- a/swh/web/static/css/origin.245751215322daa84934.css.map +++ b/swh/web/static/css/origin.6b57666194b71082b679.css.map @@ -1 +1 @@ -{"version":3,"sources":["/home/ndandrim/work/swh-environment/swh-web/node_modules/bootstrap-year-calendar/css/bootstrap-year-calendar.css","/home/ndandrim/work/swh-environment/swh-web/swh/web/assets/src/bundles/origin/visits-reporting.css"],"names":[],"mappings":"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","file":"origin.245751215322daa84934.css","sourcesContent":["/* =========================================================\n * Bootstrap year calendar v1.1.0\n * Repo: https://github.com/Paul-DS/bootstrap-year-calendar\n * =========================================================\n * Created by Paul David-Sivelle\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n/* Main */\n.calendar {\n padding: 4px;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n direction: ltr;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.calendar:after {\n\t/* Apply the right height on the calendar div, even if the months elements are floating */\n\tclear: both;\n\tcontent: \"\";\n\tdisplay:block;\n}\n\n.calendar.calendar-rtl {\n direction: rtl;\n}\n.calendar.calendar-rtl table tr td span {\n float: right;\n}\n\n.calendar table {\n margin: auto;\n}\n\n.calendar table td,\n.calendar table th {\n text-align: center;\n width: 20px;\n height: 20px;\n border: none;\n padding: 4px 5px;\n font-size:12px;\n}\n\n/* Header */\n.calendar .calendar-header\n{\n\twidth:100%;\n\tmargin-bottom:20px;\n}\n\n.calendar .calendar-header table\n{\n\twidth:100%;\n}\n\n.calendar .calendar-header table th\n{\n\tfont-size:22px;\n\tpadding:5px 10px;\n}\n\n.calendar .calendar-header table th:hover {\n background: #eeeeee;\n cursor: pointer;\n}\n\n.calendar .calendar-header table th.disabled,\n.calendar .calendar-header table th.disabled:hover {\n background: none;\n cursor: default;\n color:white;\n}\n\n.calendar .calendar-header table th.prev,\n.calendar .calendar-header table th.next\n{\n\twidth:20px;\n}\n\n.calendar .year-title {\n\tfont-weight:bold;\n\ttext-align:center;\n\theight:20px;\n\twidth:auto;\n}\n\n.calendar .year-neighbor\n{\n\tcolor:#aaaaaa;\n}\n\n.calendar .year-neighbor2\n{\n\tcolor:#dddddd;\n}\n\n/* Months */\n.calendar .months-container {\n\twidth:100%;\n\tdisplay:none;\n}\n\n.calendar .month-container {\n\ttext-align:center;\n\t/*height:200px;*/\n\tpadding:0;\n}\n\n.calendar table.month th.month-title\n{\n\tfont-size:16px;\n\tpadding-bottom: 5px;\n}\n\n.calendar table.month th.day-header\n{\n\tfont-size:14px;\n}\n\n\n.calendar table.month tr td,\n.calendar table.month tr th\n{\n\tpadding:0;\n}\n\n.calendar table.month tr td.hidden,\n.calendar table.month tr th.hidden\n{\n\tdisplay:none;\n}\n\n.calendar table.month td.week-number {\n\tcursor: default;\n\tfont-weight:bold;\n\tborder-right:1px solid #eee;\n\tpadding:5px;\n}\n\n.calendar .round-left {\n\t-webkit-border-radius: 8px 0 0 8px;\n\t-moz-border-radius: 8px 0 0 8px;\n\tborder-radius: 8px 0 0 8px;\n}\n\n.calendar .round-right {\n\twebkit-border-radius: 0 8px 8px 0 ;\n\t-moz-border-radius: 0 8px 8px 0;\n\tborder-radius: 0 8px 8px 0;\n}\n\n.calendar table.month tr td .day-content {\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n\tborder-radius: 4px;\n\tpadding: 5px 6px;\n}\n\n.table-striped .calendar table.month tr td,\n.table-striped .calendar table.month tr th {\n background-color: transparent;\n}\n\n.calendar table.month td.day .day-content:hover {\n background: rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n.calendar table.month tr td.old,\n.calendar table.month tr td.new,\n.calendar table.month tr td.old:hover,\n.calendar table.month tr td.new:hover {\n background: none;\n cursor: default;\n}\n.calendar table.month tr td.disabled,\n.calendar table.month tr td.disabled:hover {\n color: #dddddd;\n}\n\n.calendar table.month td.day.disabled .day-content:hover {\n\tbackground: none;\n\tcursor: default;\n}\n\n.calendar table.month tr td.range .day-content {\n background: rgba(0, 0, 0, 0.2);\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n border-radius: 0;\n}\n\n.calendar table.month tr td.range.range-start .day-content {\n border-top-left-radius:4px;\n border-bottom-left-radius:4px;\n}\n\n.calendar table.month tr td.range.range-end .day-content {\n border-top-right-radius:4px;\n border-bottom-right-radius:4px;\n}\n\n.calendar-context-menu,\n.calendar-context-menu .submenu {\n\tborder: 1px solid #ddd;\n\tbackground-color: white;\n\tbox-shadow: 2px 2px 5px rgba(0, 0, 0, .2);\n\t-webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);\n\tposition:absolute;\n\tdisplay:none;\n}\n\n.calendar-context-menu .item {\n\tpadding:5px 10px;\n\tcursor:pointer;\n\tdisplay:table;\n\twidth:100%;\n}\n\n.calendar-context-menu .item:hover {\n\tbackground:#eee;\n}\n\n.calendar-context-menu .item .content {\n\tdisplay:table-cell;\n}\n\n.calendar-context-menu .item span {\n\tdisplay:table-cell;\n\tpadding-left:10px;\n\ttext-align:right;\n}\n\n.calendar-context-menu .item span:last-child {\n\tdisplay:none;\n}\n\n.calendar-context-menu .submenu {\n\tleft: 100%;\n\tmargin-top: -6px;\n}\n\n.calendar-context-menu .item:hover > .submenu {\n\tdisplay:block;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n.swh-visit-full {\n color: green;\n position: relative;\n}\n\n.swh-visit-full::before {\n content: '\\f00c';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-partial {\n color: #edc344;\n position: relative;\n}\n\n.swh-visit-partial::before {\n content: '\\f071';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-failed {\n color: #f00;\n position: relative;\n}\n\n.swh-visit-failed::before {\n content: '\\f06a';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-ongoing {\n color: #00f;\n position: relative;\n}\n\n.swh-visit-ongoing::before {\n content: '\\f021';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n#swh-visits-calendar.calendar table td {\n width: 28px;\n height: 28px;\n padding: 0;\n}\n\n.d3-wrapper {\n position: relative;\n height: 0;\n width: 100%;\n padding: 0;\n\n /* padding-bottom will be overwritten by JavaScript later */\n padding-bottom: 100%;\n}\n\n.d3-wrapper > svg {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n}\n\nsvg .grid line {\n stroke: lightgrey;\n stroke-opacity: 0.7;\n shape-rendering: crispEdges;\n}\n\nsvg .grid path {\n stroke-width: 0;\n}\n\ndiv.d3-tooltip {\n position: absolute;\n text-align: center;\n width: auto;\n height: auto;\n padding: 2px;\n font: 12px sans-serif;\n background: white;\n border: 1px solid black;\n border-radius: 4px;\n pointer-events: none;\n}\n\n.swh-visits-list-column {\n float: left;\n padding: 10px;\n}\n\n.swh-visits-list-row {\n padding-left: 50px;\n}\n\n.swh-visits-list-row::after {\n content: \"\";\n display: table;\n clear: both;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["/home/ndandrim/work/swh-environment/swh-web/node_modules/bootstrap-year-calendar/css/bootstrap-year-calendar.css","/home/ndandrim/work/swh-environment/swh-web/swh/web/assets/src/bundles/origin/visits-reporting.css"],"names":[],"mappings":"AAoBA,UAGE,uBAAwB,AAMxB,sBAAuB,AACvB,qBAAsB,AARtB,0BAA2B,AAI3B,2BAA4B,AAC5B,yBAA0B,AAH1B,kBAAmB,AACnB,cAAe,AAJf,YAAa,AAUb,gBAAkB,CACnB,AAED,gBAEC,WAAY,AACZ,WAAY,AACZ,aAAc,CACd,AAED,uBACE,aAAe,CAChB,AACD,wCACE,WAAa,CACd,AAED,gBACE,WAAa,CACd,AAED,sCAKE,YAAa,AAEb,eAAe,AAHf,YAAa,AAEb,gBAAiB,AAJjB,kBAAmB,AACnB,UAAY,CAKb,AAGD,2BAGC,mBAAmB,AADnB,UAAW,CAEX,AAED,iCAEC,UAAW,CACX,AAED,oCAEC,eAAe,AACf,gBAAiB,CACjB,AAED,0CACE,gBAAoB,AACpB,cAAgB,CACjB,AAED,gGAEE,gBAAiB,AAEjB,WAAY,AADZ,cAAgB,CAEjB,AAED,kFAGC,UAAW,CACX,AAED,sBACC,gBAAiB,AAEjB,YAAY,AADZ,kBAAkB,AAElB,UAAW,CACX,AAED,yBAEC,UAAc,CACd,AAED,0BAEC,UAAc,CACd,AAGD,4BAEC,aAAa,AADb,UAAW,CAEX,AAED,2BAGC,UAAU,AAFV,iBAAkB,CAGlB,AAED,qCAEC,eAAe,AACf,kBAAoB,CACpB,AAED,oCAEC,cAAe,CACf,AAGD,wDAGC,SAAU,CACV,AAED,sEAGC,YAAa,CACb,AAED,qCAGC,4BAA4B,AAF5B,eAAgB,AAChB,gBAAiB,AAEjB,WAAY,CACZ,AAED,sBAEC,+BAAgC,AADhC,kCAAmC,AAEnC,yBAA2B,CAC3B,AAED,uBAEC,+BAAgC,AAChC,kCAA2B,AAA3B,0BAA2B,AAF3B,gCAAmC,CAGnC,AAED,yCAEC,uBAAwB,AADxB,0BAA2B,AAE3B,kBAAmB,AACnB,eAAiB,CACjB,AAED,sFAEE,4BAA8B,CAC/B,AAED,gDACE,0BAA+B,AAC/B,cAAgB,CACjB,AACD,4IAIE,gBAAiB,AACjB,cAAgB,CACjB,AACD,gFAEE,UAAe,CAChB,AAED,yDACC,gBAAiB,AACjB,cAAgB,CAChB,AAED,+CAGE,qBAAsB,AADtB,wBAAyB,AADxB,0BAA+B,AAGhC,eAAiB,CAClB,AAED,2DAEE,kCAA8B,AAD9B,+BAA2B,AAC3B,sCAA8B,AAD9B,mCAA2B,AAC3B,8BAA8B,AAD9B,0BAA2B,CAE5B,AAED,yDAEE,mCAA+B,AAD/B,gCAA4B,AAC5B,uCAA+B,AAD/B,oCAA4B,AAC5B,+BAA+B,AAD/B,2BAA4B,CAE7B,AAED,uDAIC,2CAA0C,AAC1C,8CAAkD,AAFlD,sBAAwB,AADxB,sBAAuB,AAEvB,sCAA0C,AAG1C,aAAa,AADb,iBAAkB,CAElB,AAED,6BAEC,eAAe,AACf,cAAc,AAFd,iBAAiB,AAGjB,UAAW,CACX,AAED,mCACC,eAAgB,CAChB,AAED,sCACC,kBAAmB,CACnB,AAED,kCACC,mBAAmB,AACnB,kBAAkB,AAClB,gBAAiB,CACjB,AAED,6CACC,YAAa,CACb,AAED,gCACC,UAAW,AACX,eAAiB,CACjB,AAED,4CACC,aAAc,CACd,AC/PD,gBACI,YAAa,AACb,iBAAmB,CACtB,AAED,uBACI,gBAAiB,AACjB,wBAA2B,AAC3B,WAAY,AACZ,kBAAmB,AACnB,QAAU,CACb,AAED,mBACI,cAAe,AACf,iBAAmB,CACtB,AAED,0BACI,gBAAiB,AACjB,wBAA2B,AAC3B,WAAY,AACZ,kBAAmB,AACnB,QAAU,CACb,AAED,kBACI,UAAY,AACZ,iBAAmB,CACtB,AAED,yBACI,gBAAiB,AACjB,wBAA2B,AAC3B,WAAY,AACZ,kBAAmB,AACnB,QAAU,CACb,AAED,mBACI,WAAY,AACZ,iBAAmB,CACtB,AAED,0BACI,gBAAiB,AACjB,wBAA2B,AAC3B,WAAY,AACZ,kBAAmB,AACnB,QAAU,CACb,AAED,uCAEI,YAAa,AACb,UAAW,AAFX,UAAY,CAGf,AAED,YAEI,SAAU,AAKV,iBAAqB,AANrB,kBAAmB,AAEnB,UAAY,CAKf,AAED,gBAEI,YAAa,AAEb,OAAQ,AAHR,kBAAmB,AAInB,MAAO,AAFP,UAAY,CAGf,AAED,eAGI,2BAA4B,AAF5B,eAAkB,AAClB,iBAAoB,CAEvB,AAED,eACI,cAAgB,CACnB,AAED,eASI,uBAAmB,AAAnB,0BAAmB,AAFnB,gBAAkB,AAClB,sBAAwB,AACxB,kBAAmB,AAHnB,qBAAsB,AAFtB,YAAa,AACb,YAAa,AAKb,oBAAqB,AATrB,kBAAmB,AACnB,kBAAmB,AACnB,UAAY,CAQf,AAED,wBACI,WAAY,AACZ,YAAc,CACjB,AAED,qBACI,iBAAmB,CACtB,AAED,2BAGI,WAAY,AAFZ,WAAY,AACZ,aAAe,CAElB","file":"origin.6b57666194b71082b679.css","sourcesContent":["/* =========================================================\n * Bootstrap year calendar v1.1.0\n * Repo: https://github.com/Paul-DS/bootstrap-year-calendar\n * =========================================================\n * Created by Paul David-Sivelle\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n/* Main */\n.calendar {\n padding: 4px;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n direction: ltr;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.calendar:after {\n\t/* Apply the right height on the calendar div, even if the months elements are floating */\n\tclear: both;\n\tcontent: \"\";\n\tdisplay:block;\n}\n\n.calendar.calendar-rtl {\n direction: rtl;\n}\n.calendar.calendar-rtl table tr td span {\n float: right;\n}\n\n.calendar table {\n margin: auto;\n}\n\n.calendar table td,\n.calendar table th {\n text-align: center;\n width: 20px;\n height: 20px;\n border: none;\n padding: 4px 5px;\n font-size:12px;\n}\n\n/* Header */\n.calendar .calendar-header\n{\n\twidth:100%;\n\tmargin-bottom:20px;\n}\n\n.calendar .calendar-header table\n{\n\twidth:100%;\n}\n\n.calendar .calendar-header table th\n{\n\tfont-size:22px;\n\tpadding:5px 10px;\n}\n\n.calendar .calendar-header table th:hover {\n background: #eeeeee;\n cursor: pointer;\n}\n\n.calendar .calendar-header table th.disabled,\n.calendar .calendar-header table th.disabled:hover {\n background: none;\n cursor: default;\n color:white;\n}\n\n.calendar .calendar-header table th.prev,\n.calendar .calendar-header table th.next\n{\n\twidth:20px;\n}\n\n.calendar .year-title {\n\tfont-weight:bold;\n\ttext-align:center;\n\theight:20px;\n\twidth:auto;\n}\n\n.calendar .year-neighbor\n{\n\tcolor:#aaaaaa;\n}\n\n.calendar .year-neighbor2\n{\n\tcolor:#dddddd;\n}\n\n/* Months */\n.calendar .months-container {\n\twidth:100%;\n\tdisplay:none;\n}\n\n.calendar .month-container {\n\ttext-align:center;\n\t/*height:200px;*/\n\tpadding:0;\n}\n\n.calendar table.month th.month-title\n{\n\tfont-size:16px;\n\tpadding-bottom: 5px;\n}\n\n.calendar table.month th.day-header\n{\n\tfont-size:14px;\n}\n\n\n.calendar table.month tr td,\n.calendar table.month tr th\n{\n\tpadding:0;\n}\n\n.calendar table.month tr td.hidden,\n.calendar table.month tr th.hidden\n{\n\tdisplay:none;\n}\n\n.calendar table.month td.week-number {\n\tcursor: default;\n\tfont-weight:bold;\n\tborder-right:1px solid #eee;\n\tpadding:5px;\n}\n\n.calendar .round-left {\n\t-webkit-border-radius: 8px 0 0 8px;\n\t-moz-border-radius: 8px 0 0 8px;\n\tborder-radius: 8px 0 0 8px;\n}\n\n.calendar .round-right {\n\twebkit-border-radius: 0 8px 8px 0 ;\n\t-moz-border-radius: 0 8px 8px 0;\n\tborder-radius: 0 8px 8px 0;\n}\n\n.calendar table.month tr td .day-content {\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n\tborder-radius: 4px;\n\tpadding: 5px 6px;\n}\n\n.table-striped .calendar table.month tr td,\n.table-striped .calendar table.month tr th {\n background-color: transparent;\n}\n\n.calendar table.month td.day .day-content:hover {\n background: rgba(0, 0, 0, 0.2);\n cursor: pointer;\n}\n.calendar table.month tr td.old,\n.calendar table.month tr td.new,\n.calendar table.month tr td.old:hover,\n.calendar table.month tr td.new:hover {\n background: none;\n cursor: default;\n}\n.calendar table.month tr td.disabled,\n.calendar table.month tr td.disabled:hover {\n color: #dddddd;\n}\n\n.calendar table.month td.day.disabled .day-content:hover {\n\tbackground: none;\n\tcursor: default;\n}\n\n.calendar table.month tr td.range .day-content {\n background: rgba(0, 0, 0, 0.2);\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n border-radius: 0;\n}\n\n.calendar table.month tr td.range.range-start .day-content {\n border-top-left-radius:4px;\n border-bottom-left-radius:4px;\n}\n\n.calendar table.month tr td.range.range-end .day-content {\n border-top-right-radius:4px;\n border-bottom-right-radius:4px;\n}\n\n.calendar-context-menu,\n.calendar-context-menu .submenu {\n\tborder: 1px solid #ddd;\n\tbackground-color: white;\n\tbox-shadow: 2px 2px 5px rgba(0, 0, 0, .2);\n\t-webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);\n\tposition:absolute;\n\tdisplay:none;\n}\n\n.calendar-context-menu .item {\n\tpadding:5px 10px;\n\tcursor:pointer;\n\tdisplay:table;\n\twidth:100%;\n}\n\n.calendar-context-menu .item:hover {\n\tbackground:#eee;\n}\n\n.calendar-context-menu .item .content {\n\tdisplay:table-cell;\n}\n\n.calendar-context-menu .item span {\n\tdisplay:table-cell;\n\tpadding-left:10px;\n\ttext-align:right;\n}\n\n.calendar-context-menu .item span:last-child {\n\tdisplay:none;\n}\n\n.calendar-context-menu .submenu {\n\tleft: 100%;\n\tmargin-top: -6px;\n}\n\n.calendar-context-menu .item:hover > .submenu {\n\tdisplay:block;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n.swh-visit-full {\n color: green;\n position: relative;\n}\n\n.swh-visit-full::before {\n content: '\\f00c';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-partial {\n color: #edc344;\n position: relative;\n}\n\n.swh-visit-partial::before {\n content: '\\f071';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-failed {\n color: #f00;\n position: relative;\n}\n\n.swh-visit-failed::before {\n content: '\\f06a';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n.swh-visit-ongoing {\n color: #00f;\n position: relative;\n}\n\n.swh-visit-ongoing::before {\n content: '\\f021';\n font-family: 'FontAwesome';\n left: -20px;\n position: absolute;\n top: -2px;\n}\n\n#swh-visits-calendar.calendar table td {\n width: 28px;\n height: 28px;\n padding: 0;\n}\n\n.d3-wrapper {\n position: relative;\n height: 0;\n width: 100%;\n padding: 0;\n\n /* padding-bottom will be overwritten by JavaScript later */\n padding-bottom: 100%;\n}\n\n.d3-wrapper > svg {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n}\n\nsvg .grid line {\n stroke: lightgrey;\n stroke-opacity: 0.7;\n shape-rendering: crispEdges;\n}\n\nsvg .grid path {\n stroke-width: 0;\n}\n\ndiv.d3-tooltip {\n position: absolute;\n text-align: center;\n width: auto;\n height: auto;\n padding: 2px;\n font: 12px sans-serif;\n background: white;\n border: 1px solid black;\n border-radius: 4px;\n pointer-events: none;\n}\n\n.swh-visits-list-column {\n float: left;\n padding: 10px;\n}\n\n.swh-visits-list-row {\n padding-left: 50px;\n}\n\n.swh-visits-list-row::after {\n content: \"\";\n display: table;\n clear: both;\n}\n"]} \ No newline at end of file diff --git a/swh/web/static/js/origin.245751215322daa84934.js b/swh/web/static/js/origin.6b57666194b71082b679.js similarity index 99% rename from swh/web/static/js/origin.245751215322daa84934.js rename to swh/web/static/js/origin.6b57666194b71082b679.js index e3806463..bec2aaa9 100644 --- a/swh/web/static/js/origin.245751215322daa84934.js +++ b/swh/web/static/js/origin.6b57666194b71082b679.js @@ -1,2 +1,2 @@ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.origin=e():(t.swh=t.swh||{},t.swh.origin=e())}(window,function(){return function(n){var r={};function a(t){if(r[t])return r[t].exports;var e=r[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,a),e.l=!0,e.exports}return a.m=n,a.c=r,a.d=function(t,e,n){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)a.d(n,r,function(t){return e[t]}.bind(null,r));return n},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="/static/",a(a.s=227)}({1:function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},10:function(t,e,n){var b=n(1),_=n(3),g=n(21),y=n(9),v=n(17),m="prototype",w=function(t,e,n){var r,a,i,o=t&w.F,f=t&w.G,s=t&w.S,c=t&w.P,u=t&w.B,l=t&w.W,h=f?_:_[e]||(_[e]={}),d=h[m],p=f?b:s?b[e]:(b[e]||{})[m];for(r in f&&(n=e),n)(a=!o&&p&&void 0!==p[r])&&v(h,r)||(i=a?p[r]:n[r],h[r]=f&&"function"!=typeof p[r]?n[r]:u&&a?g(i,b):l&&p[r]==i?function(r){var t=function(t,e,n){if(this instanceof r){switch(arguments.length){case 0:return new r;case 1:return new r(t);case 2:return new r(t,e)}return new r(t,e,n)}return r.apply(this,arguments)};return t[m]=r[m],t}(i):c&&"function"==typeof i?g(Function.call,i):i,c&&((h.virtual||(h.virtual={}))[r]=i,t&w.R&&d&&!d[r]&&y(d,r,i)))};w.F=1,w.G=2,w.S=4,w.P=8,w.B=16,w.W=32,w.U=64,w.R=128,t.exports=w},11:function(t,e,n){t.exports=!n(23)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},13:function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},15:function(t,e,n){t.exports=n(74)},17:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},18:function(t,e,n){var r=n(5),a=n(57),i=n(58),o=Object.defineProperty;e.f=n(11)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),a)try{return o(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},19:function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},21:function(t,e,n){var i=n(22);t.exports=function(r,a,t){if(i(r),void 0===a)return r;switch(t){case 1:return function(t){return r.call(a,t)};case 2:return function(t,e){return r.call(a,t,e)};case 3:return function(t,e,n){return r.call(a,t,e,n)}}return function(){return r.apply(a,arguments)}}},22:function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},227:function(t,e,n){t.exports=n(435)},228:function(t,e){!function(v){var n=function(t,e){this.element=t,this.element.addClass("calendar"),this._initializeEvents(e),this._initializeOptions(e),this.setYear(this.options.startYear)};n.prototype={constructor:n,_initializeOptions:function(t){null==t&&(t=[]),this.options={startYear:isNaN(parseInt(t.startYear))?(new Date).getFullYear():parseInt(t.startYear),minDate:t.minDate instanceof Date?t.minDate:null,maxDate:t.maxDate instanceof Date?t.maxDate:null,language:null!=t.language&&null!=m[t.language]?t.language:"en",allowOverlap:null==t.allowOverlap||t.allowOverlap,displayWeekNumber:null!=t.displayWeekNumber&&t.displayWeekNumber,displayDisabledDataSource:null!=t.displayDisabledDataSource&&t.displayDisabledDataSource,displayHeader:null==t.displayHeader||t.displayHeader,alwaysHalfDay:null!=t.alwaysHalfDay&&t.alwaysHalfDay,enableRangeSelection:null!=t.enableRangeSelection&&t.enableRangeSelection,disabledDays:t.disabledDays instanceof Array?t.disabledDays:[],disabledWeekDays:t.disabledWeekDays instanceof Array?t.disabledWeekDays:[],hiddenWeekDays:t.hiddenWeekDays instanceof Array?t.hiddenWeekDays:[],roundRangeLimits:null!=t.roundRangeLimits&&t.roundRangeLimits,dataSource:t.dataSource instanceof Array?t.dataSource:[],style:"background"==t.style||"border"==t.style||"custom"==t.style?t.style:"border",enableContextMenu:null!=t.enableContextMenu&&t.enableContextMenu,contextMenuItems:t.contextMenuItems instanceof Array?t.contextMenuItems:[],customDayRenderer:v.isFunction(t.customDayRenderer)?t.customDayRenderer:null,customDataSourceRenderer:v.isFunction(t.customDataSourceRenderer)?t.customDataSourceRenderer:null,weekStart:isNaN(parseInt(t.weekStart))?null:parseInt(t.weekStart)},this._initializeDatasourceColors()},_initializeEvents:function(t){null==t&&(t=[]),t.yearChanged&&this.element.bind("yearChanged",t.yearChanged),t.renderEnd&&this.element.bind("renderEnd",t.renderEnd),t.clickDay&&this.element.bind("clickDay",t.clickDay),t.dayContextMenu&&this.element.bind("dayContextMenu",t.dayContextMenu),t.selectRange&&this.element.bind("selectRange",t.selectRange),t.mouseOnDay&&this.element.bind("mouseOnDay",t.mouseOnDay),t.mouseOutDay&&this.element.bind("mouseOutDay",t.mouseOutDay)},_initializeDatasourceColors:function(){for(var t=0;tnew Date(this.options.startYear-1,11,31)&&r.addClass("disabled");var a=v(document.createElement("span"));a.addClass("oi oi-chevron-left"),r.append(a),n.append(r);var i=v(document.createElement("th"));i.addClass("year-title year-neighbor2 d-none d-md-table-cell"),i.text(this.options.startYear-2),null!=this.options.minDate&&this.options.minDate>new Date(this.options.startYear-2,11,31)&&i.addClass("disabled"),n.append(i);var o=v(document.createElement("th"));o.addClass("year-title year-neighbor d-none d-sm-table-cell"),o.text(this.options.startYear-1),null!=this.options.minDate&&this.options.minDate>new Date(this.options.startYear-1,11,31)&&o.addClass("disabled"),n.append(o);var f=v(document.createElement("th"));f.addClass("year-title"),f.text(this.options.startYear),n.append(f);var s=v(document.createElement("th"));s.addClass("year-title year-neighbor d-none d-sm-table-cell"),s.text(this.options.startYear+1),null!=this.options.maxDate&&this.options.maxDateo.options.minDate)&&(null==o.options.maxDate||t<=o.options.maxDate)){for(var i=[],n=0;n=e&&!(o.options.dataSource[n].endDate=o.options.minDate)&&(null==o.options.maxDate||t<=o.options.maxDate)){for(var r=0;r=t&&n.push(i[r]);0i._rangeStart?i._rangeEnd:i._rangeStart;i._triggerEvent("selectRange",{startDate:e,endDate:n,events:i.getEventsOnRange(e,new Date(n.getFullYear(),n.getMonth(),n.getDate()+1))})}})),t.mouseenter(function(t){if(!i._mouseDown){var e=i._getDate(v(this));i._triggerEvent("mouseOnDay",{element:v(this),date:e,events:i.getEvents(e)})}}),t.mouseleave(function(t){var e=i._getDate(v(this));i._triggerEvent("mouseOutDay",{element:v(this),date:e,events:i.getEvents(e)})}),setInterval(function(){var t=v(i.element).width(),e=v(i.element).find(".month").first().width()+10,n="month-container";n+=6*ee._rangeStart?e._rangeEnd:e._rangeStart;this.element.find(".month-container").each(function(){var t=v(this).data("month-id");n.getMonth()<=t&&r.getMonth()>=t&&v(this).find("td.day:not(.old, .new)").each(function(){var t=e._getDate(v(this));n<=t&&t<=r&&(v(this).addClass("range"),t.getTime()==n.getTime()&&v(this).addClass("range-start"),t.getTime()==r.getTime()&&v(this).addClass("range-end"))})})}},_openContextMenu:function(t){var e=v(".calendar-context-menu");0").css("color",t)},_getDate:function(t){var e=t.children(".day-content").text(),n=t.closest(".month-container").data("month-id"),r=this.options.startYear;return new Date(r,n,e)},_triggerEvent:function(t,e){var n=v.Event(t);for(var r in e)n[r]=e[r];return this.element.trigger(n),n},_isDisabled:function(t){if(null!=this.options.minDate&&tthis.options.maxDate)return!0;if(0=t&&n.push(this.options.dataSource[r]);return n},getYear:function(){return this.options.startYear},setYear:function(t){var e=parseInt(t);isNaN(e)||(this.options.startYear=e,this.element.empty(),this.options.displayHeader&&this._renderHeader(),this._triggerEvent("yearChanged",{currentYear:this.options.startYear,preventRendering:!1}).preventRendering||this.render())},getMinDate:function(){return this.options.minDate},setMinDate:function(t,e){t instanceof Date&&(this.options.minDate=t,e||this.render())},getMaxDate:function(){return this.options.maxDate},setMaxDate:function(t,e){t instanceof Date&&(this.options.maxDate=t,e||this.render())},getStyle:function(){return this.options.style},setStyle:function(t,e){this.options.style="background"==t||"border"==t||"custom"==t?t:"border",e||this.render()},getAllowOverlap:function(){return this.options.allowOverlap},setAllowOverlap:function(t){this.options.allowOverlap=t},getDisplayWeekNumber:function(){return this.options.displayWeekNumber},setDisplayWeekNumber:function(t,e){this.options.displayWeekNumber=t,e||this.render()},getDisplayHeader:function(){return this.options.displayHeader},setDisplayHeader:function(t,e){this.options.displayHeader=t,e||this.render()},getDisplayDisabledDataSource:function(){return this.options.displayDisabledDataSource},setDisplayDisabledDataSource:function(t,e){this.options.displayDisabledDataSource=t,e||this.render()},getAlwaysHalfDay:function(){return this.options.alwaysHalfDay},setAlwaysHalfDay:function(t,e){this.options.alwaysHalfDay=t,e||this.render()},getEnableRangeSelection:function(){return this.options.enableRangeSelection},setEnableRangeSelection:function(t,e){this.options.enableRangeSelection=t,e||this.render()},getDisabledDays:function(){return this.options.disabledDays},setDisabledDays:function(t,e){this.options.disabledDays=t instanceof Array?t:[],e||this.render()},getDisabledWeekDays:function(){return this.options.disabledWeekDays},setDisabledWeekDays:function(t,e){this.options.disabledWeekDays=t instanceof Array?t:[],e||this.render()},getHiddenWeekDays:function(){return this.options.hiddenWeekDays},setHiddenWeekDays:function(t,e){this.options.hiddenWeekDays=t instanceof Array?t:[],e||this.render()},getRoundRangeLimits:function(){return this.options.roundRangeLimits},setRoundRangeLimits:function(t,e){this.options.roundRangeLimits=t,e||this.render()},getEnableContextMenu:function(){return this.options.enableContextMenu},setEnableContextMenu:function(t,e){this.options.enableContextMenu=t,e||this.render()},getContextMenuItems:function(){return this.options.contextMenuItems},setContextMenuItems:function(t,e){this.options.contextMenuItems=t instanceof Array?t:[],e||this.render()},getCustomDayRenderer:function(){return this.options.customDayRenderer},setCustomDayRenderer:function(t,e){this.options.customDayRenderer=v.isFunction(t)?t:null,e||this.render()},getCustomDataSourceRenderer:function(){return this.options.customDataSourceRenderer},setCustomDataSourceRenderer:function(t,e){this.options.customDataSourceRenderer=v.isFunction(t)?t:null,e||this.render()},getLanguage:function(){return this.options.language},setLanguage:function(t,e){null!=t&&null!=m[t]&&(this.options.language=t,e||this.render())},getDataSource:function(){return this.options.dataSource},setDataSource:function(t,e){this.options.dataSource=t instanceof Array?t:[],this._initializeDatasourceColors(),e||this.render()},getWeekStart:function(){return this.options.weekStart?this.options.weekStart:m[this.options.language].weekStart},setWeekStart:function(t,e){this.options.weekStart=isNaN(parseInt(t))?null:parseInt(t),e||this.render()},addEvent:function(t,e){this.options.dataSource.push(t),e||this.render()}},v.fn.calendar=function(t){var e=new n(v(this),t);return v(this).data("calendar",e),e},v.fn.yearChanged=function(t){v(this).bind("yearChanged",t)},v.fn.renderEnd=function(t){v(this).bind("renderEnd",t)},v.fn.clickDay=function(t){v(this).bind("clickDay",t)},v.fn.dayContextMenu=function(t){v(this).bind("dayContextMenu",t)},v.fn.selectRange=function(t){v(this).bind("selectRange",t)},v.fn.mouseOnDay=function(t){v(this).bind("mouseOnDay",t)},v.fn.mouseOutDay=function(t){v(this).bind("mouseOutDay",t)};var m=v.fn.calendar.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekShort:"W",weekStart:0}},e=v.fn.calendar.colors=["#2C8FC9","#9CB703","#F5BB00","#FF4A32","#B56CE2","#45A597"];v(function(){v('[data-provide="calendar"]').each(function(){v(this).calendar()})})}(window.jQuery)},229:function(t,e,n){},23:function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},230:function(t,e,n){},29:function(t,e,n){var r=n(13),a=n(1).document,i=r(a)&&r(a.createElement);t.exports=function(t){return i?a.createElement(t):{}}},3:function(t,e){var n=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},36:function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},435:function(t,e,n){"use strict";n.r(e);var R=function(t,e){return t>>1;i(t[a],e)<0?n=a+1:r=a}return n},right:function(t,e,n,r){for(null==n&&(n=0),null==r&&(r=t.length);n>>1;0f;)s.pop(),--c;var u,l=new Array(c+1);for(e=0;e<=c;++e)(u=l[e]=[]).x0=0>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):(e=$t.exec(t))?Gt(parseInt(e[1],16)):(e=qt.exec(t))?new ne(e[1],e[2],e[3],1):(e=zt.exec(t))?new ne(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Xt.exec(t))?Kt(e[1],e[2],e[3],e[4]):(e=Vt.exec(t))?Kt(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Bt.exec(t))?ae(e[1],e[2]/100,e[3]/100,1):(e=Zt.exec(t))?ae(e[1],e[2]/100,e[3]/100,e[4]):Jt.hasOwnProperty(t)?Gt(Jt[t]):"transparent"===t?new ne(NaN,NaN,NaN,0):null}function Gt(t){return new ne(t>>16&255,t>>8&255,255&t,1)}function Kt(t,e,n,r){return r<=0&&(t=e=n=NaN),new ne(t,e,n,r)}function te(t){return t instanceof Pt||(t=Qt(t)),t?new ne((t=t.rgb()).r,t.g,t.b,t.opacity):new ne}function ee(t,e,n,r){return 1===arguments.length?te(t):new ne(t,e,n,null==r?1:r)}function ne(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function re(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function ae(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||1<=n?t=e=NaN:e<=0&&(t=NaN),new oe(t,e,n,r)}function ie(t,e,n,r){return 1===arguments.length?function(t){if(t instanceof oe)return new oe(t.h,t.s,t.l,t.opacity);if(t instanceof Pt||(t=Qt(t)),!t)return new oe;if(t instanceof oe)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,a=Math.min(e,n,r),i=Math.max(e,n,r),o=NaN,f=i-a,s=(i+a)/2;return f?(o=e===i?(n-r)/f+6*(nf&&(a=r.slice(f,a),c[s]?c[s]+=a:c[++s]=a),(e=e[0])===(n=n[0])?c[s]?c[s]+=n:c[++s]=n:(c[++s]=null,u.push({i:s,x:ze(e,n)})),f=Ve.lastIndex;return fn._time&&(r=n._time),(t=n)._next):(e=n._next,n._next=null,t?t._next=e:hn=e);dn=t,Tn(r)}(),vn=0}}function An(){var t=wn.now(),e=t-yn;gnRn)throw new Error("too late; already scheduled");return n}function Pn(t,e){var n=On(t,e);if(n.state>Yn)throw new Error("too late; already started");return n}function On(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}var Hn=function(t,e){var n,r,a,i=t.__transition,o=!0;if(i){for(a in e=null==e?null:e+"",i)(n=i[a]).name===e?(r=n.state>Yn&&n.state<5,n.state=6,n.timer.stop(),r&&n.on.call("interrupt",t,t.__data__,n.index,n.group),delete i[a]):o=!1;o&&delete t.__transition}};function In(t,e,n){var r=t._id;return t.each(function(){var t=Pn(this,r);(t.value||(t.value={}))[e]=n.apply(this,arguments)}),function(t){return On(t,r).value[e]}}var jn=function(t,e){var n;return("number"==typeof e?ze:e instanceof Qt?We:(n=Qt(e))?(e=n,We):Ge)(t,e)};var Wn=Nt.prototype.constructor;var $n=0;function qn(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function zn(){return++$n}var Xn=Nt.prototype;qn.prototype=function(t){return Nt().transition(t)}.prototype={constructor:qn,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=B(t));for(var r=this._groups,a=r.length,i=new Array(a),o=0;otr&&a){var h=n-i,d=r-o,p=f*f+s*s,b=h*h+d*d,_=Math.sqrt(p),g=Math.sqrt(l),y=a*Math.tan((Gn-Math.acos((p+l-b)/(2*_*g)))/2),v=y/g,m=y/_;Math.abs(v-1)>tr&&(this._+="L"+(t+v*c)+","+(e+v*u)),this._+="A"+a+","+a+",0,0,"+ +(c*dtr||Math.abs(this._y1-c)>tr)&&(this._+="L"+s+","+c),n&&(l<0&&(l=l%Kn+Kn),er=p.length)return null!=h&&t.sort(h),null!=d?d(t):t;for(var e,i,o,f=-1,s=t.length,c=p[n++],u=or(),l=r();++fp.length)return t;var a,i=o[r-1];return null!=d&&r>=p.length?a=t.entries():(a=[],t.each(function(t,e){a.push({key:e,values:n(t,r)})})),null!=i?a.sort(function(t,e){return i(t.key,e.key)}):a}(b(t,0,ur,lr),0)},key:function(t){return p.push(t),e},sortKeys:function(t){return o[p.length-1]=t,e},sortValues:function(t){return h=t,e},rollup:function(t){return d=t,e}}};function sr(){return{}}function cr(t,e,n){t[e]=n}function ur(){return or()}function lr(t,e,n){t.set(e,n)}function hr(){}var dr=or.prototype;hr.prototype={constructor:hr,has:dr.has,add:function(t){return this[rr+(t+="")]=t,this},remove:dr.remove,clear:dr.clear,values:dr.keys,size:dr.size,empty:dr.empty,each:dr.each};Array.prototype.slice;var pr={},br={};function _r(t){return new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+"]"}).join(",")+"}")}var gr=function(i){var e=new RegExp('["'+i+"\n\r]"),l=i.charCodeAt(0);function n(r,t){var e,n=[],a=r.length,i=0,o=0,f=a<=0,s=!1;function c(){if(f)return br;if(s)return s=!1,pr;var t,e,n=i;if(34===r.charCodeAt(n)){for(;i++=a?f=!0:10===(e=r.charCodeAt(i++))?s=!0:13===e&&(s=!0,10===r.charCodeAt(i)&&++i),r.slice(n+1,t-1).replace(/""/g,'"')}for(;i=(i=(b+g)/2))?b=i:g=i,(u=n>=(o=(_+y)/2))?_=o:y=o,!(d=(a=d)[l=u<<1|c]))return a[l]=p,t;if(f=+t._x.call(null,d.data),s=+t._y.call(null,d.data),e===f&&n===s)return p.next=d,a?a[l]=p:t._root=p,t;for(;a=a?a[l]=new Array(4):t._root=new Array(4),(c=e>=(i=(b+g)/2))?b=i:g=i,(u=n>=(o=(_+y)/2))?_=o:y=o,(l=u<<1|c)==(h=(o<=s)<<1|i<=f););return a[h]=d,a[l]=p,t}var Sr=function(t,e,n,r,a){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=a};function Ar(t,e,n,r,a,i){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=a,this._y1=i,this._root=void 0}function Tr(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var Er=Ar.prototype;Er.copy=function(){var t,e,n=new Ar(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return n;if(!r.length)return n._root=Tr(r),n;for(t=[{source:r,target:n._root=new Array(4)}];r=t.pop();)for(var a=0;a<4;++a)(e=r.source[a])&&(e.length?t.push({source:e,target:r.target[a]=new Array(4)}):r.target[a]=Tr(e));return n},Er.add=function(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return kr(this.cover(e,n),e,n,t)},Er.addAll=function(t){var e,n,r,a,i=t.length,o=new Array(i),f=new Array(i),s=1/0,c=1/0,u=-1/0,l=-1/0;for(n=0;nh||(i=s.y0)>d||(o=s.x1)=(f=(p+_)/2))?p=f:_=f,(u=o>=(s=(b+g)/2))?b=s:g=s,!(d=(e=d)[l=u<<1|c]))return this;if(!d.length)break;(e[l+1&3]||e[l+2&3]||e[l+3&3])&&(n=e,h=l)}for(;d.data!==t;)if(!(d=(r=d).next))return this;return(a=d.next)&&delete d.next,r?a?r.next=a:delete r.next:e?(a?e[l]=a:delete e[l],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(n?n[h]=d:this._root=d)):this._root=a,this},Er.removeAll=function(t){for(var e=0,n=t.length;e=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Yr(t){return new Fr(t)}function Fr(t){if(!(e=Rr.exec(t)))throw new Error("invalid format: "+t);var e;this.fill=e[1]||" ",this.align=e[2]||">",this.sign=e[3]||"-",this.symbol=e[4]||"",this.zero=!!e[5],this.width=e[6]&&+e[6],this.comma=!!e[7],this.precision=e[8]&&+e[8].slice(1),this.trim=!!e[9],this.type=e[10]||""}Yr.prototype=Fr.prototype,Fr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var Lr,Pr,Or,Hr,Ir=function(t,e){var n=Nr(t,e);if(!n)return t+"";var r=n[0],a=n[1];return a<0?"0."+new Array(-a).join("0")+r:r.length>a+1?r.slice(0,a+1)+"."+r.slice(a+1):r+new Array(a-r.length+2).join("0")},jr={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return Ir(100*t,e)},r:Ir,s:function(t,e){var n=Nr(t,e);if(!n)return t+"";var r=n[0],a=n[1],i=a-(Lr=3*Math.max(-8,Math.min(8,Math.floor(a/3))))+1,o=r.length;return i===o?r:oe));)i=f[a=(a+1)%f.length];return r.reverse().join(s)}):Wr,r=t.currency,M=t.decimal,D=t.numerals?(e=t.numerals,function(t){return t.replace(/[0-9]/g,function(t){return e[+t]})}):Wr,a=t.percent||"%";function o(t){var c=(t=Yr(t)).fill,u=t.align,l=t.sign,e=t.symbol,h=t.zero,d=t.width,p=t.comma,b=t.precision,_=t.trim,g=t.type;"n"===g?(p=!0,g="g"):jr[g]||(null==b&&(b=12),_=!0,g="g"),(h||"0"===c&&"="===u)&&(h=!0,c="0",u="=");var y="$"===e?r[0]:"#"===e&&/[boxX]/.test(g)?"0"+g.toLowerCase():"",v="$"===e?r[1]:/[%p]/.test(g)?a:"",m=jr[g],w=/[defgprs%]/.test(g);function n(t){var e,n,r,a=y,i=v;if("c"===g)i=m(t)+i,t="";else{var o=(t=+t)<0;if(t=m(Math.abs(t),b),_&&(t=function(t){t:for(var e,n=t.length,r=1,a=-1;r>1)+a+t+i+s.slice(f);break;default:t=s+a+t+i}return D(t)}return b=null==b?6:/[gprs]/.test(g)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),n.toString=function(){return t+""},n}return{format:o,formatPrefix:function(t,e){var n=o(((t=Yr(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Ur(e)/3))),a=Math.pow(10,-r),i=$r[8+r/3];return function(t){return n(a*t)+i}}}}({decimal:".",thousands:",",grouping:[3],currency:["$",""]}),Or=Pr.format,Hr=Pr.formatPrefix;var qr=function(){return new zr};function zr(){this.reset()}zr.prototype={constructor:zr,reset:function(){this.s=this.t=0},add:function(t){Vr(Xr,t,this.t),Vr(this,Xr.s,this.s),this.s?this.t+=Xr.t:this.s=Xr.t},valueOf:function(){return this.s}};var Xr=new zr;function Vr(t,e,n){var r=t.s=e+n,a=r-e,i=r-a;t.t=e-i+(n-a)}var Br=1e-6,Zr=Math.PI,Jr=Zr/2,Qr=Zr/4,Gr=2*Zr,Kr=Zr/180,ta=Math.abs,ea=Math.atan,na=Math.atan2,ra=Math.cos,aa=(Math.ceil,Math.exp),ia=(Math.floor,Math.log,Math.pow,Math.sin),oa=(Math.sign,Math.sqrt);Math.tan;function fa(t){return 1Br?ea((ia(r)*(f=ra(i))*ia(a)-ia(i)*(o=ra(r))*ia(n))/(o*f*s)):(r+i)/2,l.point(b,p),l.lineEnd(),l.lineStart(),l.point(c,p),h=0),l.point(d=t,p=e),b=c},lineEnd:function(){l.lineEnd(),d=p=NaN},clean:function(){return 2-h}}},function(t,e,n,r){var a;if(null==t)a=n*Jr,r.point(-Zr,a),r.point(0,a),r.point(Zr,a),r.point(Zr,0),r.point(Zr,-a),r.point(0,-a),r.point(-Zr,-a),r.point(-Zr,0),r.point(-Zr,a);else if(ta(t[0]-e[0])>Br){var i=t[0]Pf){var f=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,s=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*f-t._x0*t._l12_2a+t._x2*t._l01_2a)/s,a=(a*f-t._y0*t._l12_2a+t._y2*t._l01_2a)/s}if(t._l23_a>Pf){var c=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,u=3*t._l23_a*(t._l23_a+t._l12_a);i=(i*c+t._x1*t._l23_2a-e*t._l12_2a)/u,o=(o*c+t._y1*t._l23_2a-n*t._l12_2a)/u}t._context.bezierCurveTo(r,a,i,o,t._x2,t._y2)}function es(t,e){this._context=t,this._alpha=e}es.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:ts(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function e(n){function t(t){return n?new es(t,n):new Qf(t,0)}return t.alpha=function(t){return e(+t)},t})(.5);function ns(t,e){this._context=t,this._alpha=e}ns.prototype={areaStart:Xf,areaEnd:Xf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:ts(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function e(n){function t(t){return n?new ns(t,n):new Gf(t,0)}return t.alpha=function(t){return e(+t)},t})(.5);function rs(t,e){this._context=t,this._alpha=e}rs.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:ts(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function e(n){function t(t){return n?new rs(t,n):new Kf(t,0)}return t.alpha=function(t){return e(+t)},t})(.5);function as(t){return t<0?-1:1}function is(t,e,n){var r=t._x1-t._x0,a=e-t._x1,i=(t._y1-t._y0)/(r||a<0&&-0),o=(n-t._y1)/(a||r<0&&-0),f=(i*a+o*r)/(r+a);return(as(i)+as(o))*Math.min(Math.abs(i),Math.abs(o),.5*Math.abs(f))||0}function os(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function fs(t,e,n){var r=t._x0,a=t._y0,i=t._x1,o=t._y1,f=(i-r)/3;t._context.bezierCurveTo(r+f,a+f*e,i-f,o-f*n,i,o)}function ss(t){this._context=t}function cs(t){var e,n,r=t.length-1,a=new Array(r),i=new Array(r),o=new Array(r);for(i[a[0]=0]=2,o[0]=t[0]+2*t[1],1;e=a)return}else s=[b,n];i=[b,a]}else{if(s){if(s[1]=a)return}else s=[(n-f)/o,n];i=[(a-f)/o,a]}else{if(s){if(s[1]=r)return}else s=[e,o*e+f];i=[r,o*r+f]}else{if(s){if(s[0]$s||Math.abs(a[0][1]-a[1][1])>$s)||delete Ws[i]}(o,f,s,c),function(t,e,n,r){var a,i,o,f,s,c,u,l,h,d,p,b,_,g,y=Is.length,v=!0;for(a=0;a$s||Math.abs(b-h)>$s)&&(s.splice(f,0,Ws.push(ws(o,d,Math.abs(p-t)<$s&&$s=n)return null;for(var r=o-s.site[0],a=f-s.site[1],l=r*r+a*a;s=c.cells[e=u],u=null,s.halfedges.forEach(function(t){var e=c.edges[t],n=e.left;if(n!==s.site&&n||(n=e.right)){var r=o-n[0],a=f-n[1],i=r*r+a*a;i"+e[1]+" / "+e[0]+":
",r=0;r"))}l.html(n).style("left",xt.pageX+15+"px").style("top",xt.pageY+"px")}).on("mouseout",function(t){u.selectAll("rect.year"+t.data.x1.getUTCFullYear()).attr("fill-opacity",0),u.selectAll("rect.year"+n).attr("fill-opacity",.3),l.transition().duration(500).style("opacity",0)}).on("mousemove",function(){l.style("left",xt.pageX+15+"px").style("top",xt.pageY+"px")}).on("click",function(t){u.selectAll("rect.year"+n).attr("fill-opacity",0),u.selectAll("rect.yearoutline"+n).attr("stroke","none"),n=t.data.x1.getUTCFullYear(),u.selectAll("rect.year"+n).attr("fill-opacity",.5),u.selectAll("rect.yearoutline"+n).attr("stroke","black"),r(n)}),h.append("g").selectAll("rect").data(v).enter().append("rect").attr("class",function(t){return"yearoutline"+t.getUTCFullYear()}).attr("fill","none").attr("stroke",function(t){return t.getUTCFullYear()===n?"black":"none"}).attr("x",function(t){var e=new Date(Date.UTC(t.getUTCFullYear(),0,1));return d(e)}).attr("y",0).attr("height",i).attr("width",function(t){var e=new Date(Date.UTC(t.getUTCFullYear(),0,1));return d(Hi.offset(e,1))-d(e)}),h.append("g").attr("class","axis").attr("transform","translate(0,"+i+")").call((C=d,H(P,C)).ticks(Hi.every(1)).tickFormat(function(t){return t.getUTCFullYear()})).selectAll("text").attr("transform",function(t){var e=t.getUTCFullYear(),n=new Date(Date.UTC(e,0,1));return"translate("+-(d(Hi.offset(n,1))-d(n))/2+", 0)"}),h.append("g").attr("class","axis").call(I(p).tickValues(A));var N=h.append("g").attr("font-family","sans-serif").attr("font-size",10).attr("text-anchor","end");N.append("text").attr("x",a+f-5).attr("y",9.5).attr("dy","0.32em").text("visit status:");var U=N.selectAll("g").data(x.slice().reverse()).enter().append("g").attr("transform",function(t,e){return"translate(0,"+20*(e+1)+")"});U.append("rect").attr("x",a+2*f/3).attr("width",19).attr("height",19).attr("fill",b),U.append("text").attr("x",a+2*f/3-5).attr("y",9.5).attr("dy","0.32em").text(function(t){return t}),h.append("text").attr("transform","rotate(-90)").attr("y",-c).attr("x",-i/2).attr("dy","1em").style("text-anchor","middle").text("Number of visits")}var Zs=n(15),Js=n.n(Zs),Qs=(n(228),n(229),15),Gs=28,Ks=null,tc={};function ec(){Ks&&($(Ks).popover("hide"),Ks=null)}function nc(t,e,n){tc={};for(var r,a,_=0,i=0;ia.getTime()&&(a=o))}ec(),$("#swh-visits-calendar").calendar({dataSource:e,style:"custom",minDate:r,maxDate:a,startYear:t,renderEnd:function(t){return n(t.currentYear)},customDataSourceRenderer:function(t,e,n){var r=e.toDateString(),a=tc[r].length,i=a/_;1===_&&(i=0);var o=Qs+i*(Gs-Qs),f=(Gs-o)/2-Js()($(t).css("padding-left")),s=(Gs-o)/2-Js()($(t).css("padding-top"))+1,c=$("
");c.css("position","relative");var u=$("
");u.text($(t).text());for(var l=$("
"),h=0,d=0,p=0;p
"+t.date.toDateString()+"
";r+='
    ';for(var a=0;a'+i+""}r+="
",$(t.element).popover({trigger:"manual",container:"body",html:!0,content:r}),$(t.element).popover("show"),Ks=t.element}}}),$("#swh-visits-timeline").mouseenter(function(){ec()}),$("#swh-visits-list").mouseenter(function(){ec()}),$("#swh-visits-calendar.calendar table td").css("width",Gs+"px"),$("#swh-visits-calendar.calendar table td").css("height",Gs+"px"),$("#swh-visits-calendar.calendar table td").css("padding","0px")}var rc,ac,ic;n(230);function oc(t){for(var e=[],n=0;n',i=0;i
'),a+='
',a+=''+e[i].fmt_date+"",a+="
",++r;a+="
",$("#swh-visits-list").append($(a))}function sc(t){fc(ic=t),Bs(".d3-wrapper",ac,ic,cc)}function cc(t){nc(ic=t,ac,sc),fc(t)}function uc(){0!==ac.length&&(ic||(ic=ac[ac.length-1].date.getUTCFullYear()),Bs(".d3-wrapper",ac,ic,cc),nc(ic,ac,sc),fc(ic))}function lc(t){ac=oc(!0),uc()}function hc(t){ac=oc(!1),uc()}function dc(t){ac=rc,uc()}function pc(t){$(document).ready(function(){var r;(rc=t).forEach(function(t,e){t.date=new Date(Math.floor(1e3*t.date));var n=''+t.fmt_date+"";"full"===t.status&&(r?$("#swh-last-full-visit")[0].innerHTML=n:(r=t,$("#swh-first-full-visit").append($(n)),1===rc.length&&($("#swh-last-full-visit")[0].innerHTML=n))),e===rc.length-1&&$("#swh-last-visit").append($(n))}),lc()})}n.d(e,"showFullVisitsDifferentSnapshots",function(){return lc}),n.d(e,"showFullVisits",function(){return hc}),n.d(e,"showAllVisits",function(){return dc}),n.d(e,"initVisitsReporting",function(){return pc})},44:function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},5:function(t,e,n){var r=n(13);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},57:function(t,e,n){t.exports=!n(11)&&!n(23)(function(){return 7!=Object.defineProperty(n(29)("div"),"a",{get:function(){return 7}}).a})},58:function(t,e,n){var a=n(13);t.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},74:function(t,e,n){n(75),t.exports=n(3).parseInt},75:function(t,e,n){var r=n(10),a=n(76);r(r.G+r.F*(parseInt!=a),{parseInt:a})},76:function(t,e,n){var r=n(1).parseInt,a=n(77).trim,i=n(44),o=/^[-+]?0[xX]/;t.exports=8!==r(i+"08")||22!==r(i+"0x16")?function(t,e){var n=a(String(t),3);return r(n,e>>>0||(o.test(n)?16:10))}:r},77:function(t,e,n){var o=n(10),r=n(19),f=n(23),s=n(44),a="["+s+"]",i=RegExp("^"+a+a+"*"),c=RegExp(a+a+"*$"),u=function(t,e,n){var r={},a=f(function(){return!!s[t]()||"​…"!="​…"[t]()}),i=r[t]=a?e(l):s[t];n&&(r[n]=i),o(o.P+o.F*a,"String",r)},l=u.trim=function(t,e){return t=String(r(t)),1&e&&(t=t.replace(i,"")),2&e&&(t=t.replace(c,"")),t};t.exports=u},9:function(t,e,n){var r=n(18),a=n(36);t.exports=n(11)?function(t,e,n){return r.f(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}}})}); -//# origin.245751215322daa84934.js.map \ No newline at end of file +//# origin.6b57666194b71082b679.js.map \ No newline at end of file diff --git a/swh/web/static/js/origin.245751215322daa84934.js.map b/swh/web/static/js/origin.6b57666194b71082b679.js.map similarity index 96% rename from swh/web/static/js/origin.245751215322daa84934.js.map rename to swh/web/static/js/origin.6b57666194b71082b679.js.map index 54eb7679..cd639907 100644 --- a/swh/web/static/js/origin.245751215322daa84934.js.map +++ b/swh/web/static/js/origin.6b57666194b71082b679.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://swh.[name]/webpack/universalModuleDefinition","webpack://swh.[name]/webpack/bootstrap","webpack://swh.[name]/./node_modules/core-js/library/modules/_global.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_export.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_descriptors.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_is-object.js","webpack://swh.[name]/./node_modules/@babel/runtime-corejs2/core-js/parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_has.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_object-dp.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_defined.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_ctx.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_a-function.js","webpack://swh.[name]/./node_modules/bootstrap-year-calendar/js/bootstrap-year-calendar.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_fails.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_dom-create.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_core.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_property-desc.js","webpack://swh.[name]/./node_modules/d3/dist/package.js","webpack://swh.[name]/./node_modules/d3-array/src/ascending.js","webpack://swh.[name]/./node_modules/d3-array/src/bisector.js","webpack://swh.[name]/./node_modules/d3-array/src/bisect.js","webpack://swh.[name]/./node_modules/d3-array/src/cross.js","webpack://swh.[name]/./node_modules/d3-array/src/extent.js","webpack://swh.[name]/./node_modules/d3-array/src/array.js","webpack://swh.[name]/./node_modules/d3-array/src/constant.js","webpack://swh.[name]/./node_modules/d3-array/src/identity.js","webpack://swh.[name]/./node_modules/d3-array/src/range.js","webpack://swh.[name]/./node_modules/d3-array/src/ticks.js","webpack://swh.[name]/./node_modules/d3-array/src/threshold/sturges.js","webpack://swh.[name]/./node_modules/d3-array/src/histogram.js","webpack://swh.[name]/./node_modules/d3-array/src/max.js","webpack://swh.[name]/./node_modules/d3-array/src/merge.js","webpack://swh.[name]/./node_modules/d3-array/src/zip.js","webpack://swh.[name]/./node_modules/d3-axis/src/array.js","webpack://swh.[name]/./node_modules/d3-axis/src/identity.js","webpack://swh.[name]/./node_modules/d3-axis/src/axis.js","webpack://swh.[name]/./node_modules/d3-dispatch/src/dispatch.js","webpack://swh.[name]/./node_modules/d3-selection/src/namespaces.js","webpack://swh.[name]/./node_modules/d3-selection/src/namespace.js","webpack://swh.[name]/./node_modules/d3-selection/src/creator.js","webpack://swh.[name]/./node_modules/d3-selection/src/selector.js","webpack://swh.[name]/./node_modules/d3-selection/src/selectorAll.js","webpack://swh.[name]/./node_modules/d3-selection/src/matcher.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/sparse.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/enter.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/data.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/sort.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/attr.js","webpack://swh.[name]/./node_modules/d3-selection/src/window.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/style.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/classed.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/text.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/html.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/raise.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/lower.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/insert.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/remove.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/clone.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/on.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/dispatch.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/index.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/select.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/selectAll.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/filter.js","webpack://swh.[name]/./node_modules/d3-selection/src/constant.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/exit.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/merge.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/order.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/call.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/nodes.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/node.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/size.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/empty.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/each.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/property.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/append.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/datum.js","webpack://swh.[name]/./node_modules/d3-selection/src/select.js","webpack://swh.[name]/./node_modules/d3-selection/src/local.js","webpack://swh.[name]/./node_modules/d3-drag/src/drag.js","webpack://swh.[name]/./node_modules/d3-color/src/define.js","webpack://swh.[name]/./node_modules/d3-color/src/color.js","webpack://swh.[name]/./node_modules/d3-color/src/math.js","webpack://swh.[name]/./node_modules/d3-color/src/lab.js","webpack://swh.[name]/./node_modules/d3-color/src/cubehelix.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/basis.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/constant.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/color.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/rgb.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/number.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/basisClosed.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/string.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/parse.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/value.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/date.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/array.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/object.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/round.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/index.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/zoom.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/hsl.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/hcl.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/cubehelix.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/quantize.js","webpack://swh.[name]/./node_modules/d3-timer/src/timer.js","webpack://swh.[name]/./node_modules/d3-timer/src/timeout.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/schedule.js","webpack://swh.[name]/./node_modules/d3-transition/src/interrupt.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/tween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/interpolate.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/remove.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/selection.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/text.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/index.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/select.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/selectAll.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/filter.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/merge.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/transition.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/on.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/attr.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/attrTween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/style.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/styleTween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/delay.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/duration.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/ease.js","webpack://swh.[name]/./node_modules/d3-ease/src/poly.js","webpack://swh.[name]/./node_modules/d3-ease/src/sin.js","webpack://swh.[name]/./node_modules/d3-ease/src/back.js","webpack://swh.[name]/./node_modules/d3-ease/src/elastic.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/transition.js","webpack://swh.[name]/./node_modules/d3-ease/src/cubic.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/index.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/interrupt.js","webpack://swh.[name]/./node_modules/d3-brush/src/brush.js","webpack://swh.[name]/./node_modules/d3-chord/src/math.js","webpack://swh.[name]/./node_modules/d3-chord/src/array.js","webpack://swh.[name]/./node_modules/d3-chord/src/chord.js","webpack://swh.[name]/./node_modules/d3-path/src/path.js","webpack://swh.[name]/./node_modules/d3-chord/src/ribbon.js","webpack://swh.[name]/./node_modules/d3-collection/src/map.js","webpack://swh.[name]/./node_modules/d3-collection/src/nest.js","webpack://swh.[name]/./node_modules/d3-collection/src/set.js","webpack://swh.[name]/./node_modules/d3-contour/src/array.js","webpack://swh.[name]/./node_modules/d3-contour/src/density.js","webpack://swh.[name]/./node_modules/d3-dsv/src/dsv.js","webpack://swh.[name]/./node_modules/d3-dsv/src/csv.js","webpack://swh.[name]/./node_modules/d3-dsv/src/tsv.js","webpack://swh.[name]/./node_modules/d3-fetch/src/text.js","webpack://swh.[name]/./node_modules/d3-fetch/src/dsv.js","webpack://swh.[name]/./node_modules/d3-fetch/src/xml.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/add.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/cover.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/quad.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/quadtree.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/data.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/extent.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/find.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/remove.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/root.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/size.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/visit.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/visitAfter.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/x.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/y.js","webpack://swh.[name]/./node_modules/d3-force/src/simulation.js","webpack://swh.[name]/./node_modules/d3-format/src/formatDecimal.js","webpack://swh.[name]/./node_modules/d3-format/src/exponent.js","webpack://swh.[name]/./node_modules/d3-format/src/formatSpecifier.js","webpack://swh.[name]/./node_modules/d3-format/src/formatTrim.js","webpack://swh.[name]/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://swh.[name]/./node_modules/d3-format/src/defaultLocale.js","webpack://swh.[name]/./node_modules/d3-format/src/formatRounded.js","webpack://swh.[name]/./node_modules/d3-format/src/formatTypes.js","webpack://swh.[name]/./node_modules/d3-format/src/identity.js","webpack://swh.[name]/./node_modules/d3-format/src/locale.js","webpack://swh.[name]/./node_modules/d3-format/src/formatNumerals.js","webpack://swh.[name]/./node_modules/d3-format/src/formatGroup.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionFixed.js","webpack://swh.[name]/./node_modules/d3-geo/src/adder.js","webpack://swh.[name]/./node_modules/d3-geo/src/math.js","webpack://swh.[name]/./node_modules/d3-geo/src/noop.js","webpack://swh.[name]/./node_modules/d3-geo/src/area.js","webpack://swh.[name]/./node_modules/d3-geo/src/cartesian.js","webpack://swh.[name]/./node_modules/d3-geo/src/bounds.js","webpack://swh.[name]/./node_modules/d3-geo/src/rotation.js","webpack://swh.[name]/./node_modules/d3-geo/src/circle.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/buffer.js","webpack://swh.[name]/./node_modules/d3-geo/src/pointEqual.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/rejoin.js","webpack://swh.[name]/./node_modules/d3-geo/src/polygonContains.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/index.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/antimeridian.js","webpack://swh.[name]/./node_modules/d3-geo/src/length.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/area.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/measure.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/string.js","webpack://swh.[name]/./node_modules/d3-geo/src/transform.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/resample.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/index.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthal.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthalEqualArea.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthalEquidistant.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/equirectangular.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/conicEquidistant.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/equalEarth.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/gnomonic.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/orthographic.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/stereographic.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/count.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/index.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/each.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/sum.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/sort.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/path.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/ancestors.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/descendants.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/leaves.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/links.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/array.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/round.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/dice.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/tree.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/slice.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/squarify.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/resquarify.js","webpack://swh.[name]/./node_modules/d3-polygon/src/hull.js","webpack://swh.[name]/./node_modules/d3-random/src/defaultSource.js","webpack://swh.[name]/./node_modules/d3-random/src/normal.js","webpack://swh.[name]/./node_modules/d3-random/src/uniform.js","webpack://swh.[name]/./node_modules/d3-random/src/irwinHall.js","webpack://swh.[name]/./node_modules/d3-random/src/logNormal.js","webpack://swh.[name]/./node_modules/d3-scale/src/array.js","webpack://swh.[name]/./node_modules/d3-random/src/bates.js","webpack://swh.[name]/./node_modules/d3-random/src/exponential.js","webpack://swh.[name]/./node_modules/d3-scale/src/ordinal.js","webpack://swh.[name]/./node_modules/d3-scale/src/constant.js","webpack://swh.[name]/./node_modules/d3-scale/src/number.js","webpack://swh.[name]/./node_modules/d3-scale/src/continuous.js","webpack://swh.[name]/./node_modules/d3-scale/src/tickFormat.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionRound.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionPrefix.js","webpack://swh.[name]/./node_modules/d3-scale/src/linear.js","webpack://swh.[name]/./node_modules/d3-scale/src/nice.js","webpack://swh.[name]/./node_modules/d3-time/src/interval.js","webpack://swh.[name]/./node_modules/d3-time/src/millisecond.js","webpack://swh.[name]/./node_modules/d3-time/src/duration.js","webpack://swh.[name]/./node_modules/d3-time/src/second.js","webpack://swh.[name]/./node_modules/d3-time/src/minute.js","webpack://swh.[name]/./node_modules/d3-time/src/hour.js","webpack://swh.[name]/./node_modules/d3-time/src/day.js","webpack://swh.[name]/./node_modules/d3-time/src/week.js","webpack://swh.[name]/./node_modules/d3-time/src/month.js","webpack://swh.[name]/./node_modules/d3-time/src/year.js","webpack://swh.[name]/./node_modules/d3-time/src/utcMinute.js","webpack://swh.[name]/./node_modules/d3-time/src/utcHour.js","webpack://swh.[name]/./node_modules/d3-time/src/utcDay.js","webpack://swh.[name]/./node_modules/d3-time/src/utcWeek.js","webpack://swh.[name]/./node_modules/d3-time/src/utcMonth.js","webpack://swh.[name]/./node_modules/d3-time/src/utcYear.js","webpack://swh.[name]/./node_modules/d3-time-format/src/locale.js","webpack://swh.[name]/./node_modules/d3-time-format/src/defaultLocale.js","webpack://swh.[name]/./node_modules/d3-time-format/src/isoFormat.js","webpack://swh.[name]/./node_modules/d3-time-format/src/isoParse.js","webpack://swh.[name]/./node_modules/d3-scale/src/time.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/colors.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/ramp.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/category10.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Accent.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Dark2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Paired.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set1.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set3.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/BrBG.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PRGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PiYG.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PuOr.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdGy.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/Spectral.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js","webpack://swh.[name]/./node_modules/d3-shape/src/constant.js","webpack://swh.[name]/./node_modules/d3-shape/src/math.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/linear.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/radial.js","webpack://swh.[name]/./node_modules/d3-shape/src/lineRadial.js","webpack://swh.[name]/./node_modules/d3-shape/src/array.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/diamond.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/circle.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/star.js","webpack://swh.[name]/./node_modules/d3-shape/src/noop.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/triangle.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/wye.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/basis.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/bundle.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinal.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRom.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/monotone.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/natural.js","webpack://swh.[name]/./node_modules/d3-shape/src/offset/none.js","webpack://swh.[name]/./node_modules/d3-shape/src/order/none.js","webpack://swh.[name]/./node_modules/d3-shape/src/stack.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/RedBlackTree.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Edge.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Cell.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Circle.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Beach.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Diagram.js","webpack://swh.[name]/./node_modules/d3-zoom/src/transform.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-histogram.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-calendar.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-reporting.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/index.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_string-ws.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_an-object.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_to-primitive.js","webpack://swh.[name]/./node_modules/core-js/library/fn/parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/es6.parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_string-trim.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_hide.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","global","Math","self","Function","__g","core","ctx","hide","has","PROTOTYPE","$export","type","source","own","out","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","S","IS_PROTO","P","IS_BIND","B","IS_WRAP","W","expProto","target","undefined","C","a","b","this","arguments","length","apply","virtual","R","U","it","anObject","IE8_DOM_DEFINE","toPrimitive","dP","f","O","Attributes","e","TypeError","aFunction","fn","that","$","Calendar","element","options","addClass","_initializeEvents","_initializeOptions","setYear","startYear","constructor","opt","isNaN","parseInt","Date","getFullYear","minDate","maxDate","language","dates","allowOverlap","displayWeekNumber","displayDisabledDataSource","displayHeader","alwaysHalfDay","enableRangeSelection","disabledDays","Array","disabledWeekDays","hiddenWeekDays","roundRangeLimits","dataSource","style","enableContextMenu","contextMenuItems","customDayRenderer","isFunction","customDataSourceRenderer","weekStart","_initializeDatasourceColors","yearChanged","renderEnd","clickDay","dayContextMenu","selectRange","mouseOnDay","mouseOutDay","color","colors","render","empty","_renderHeader","_renderBody","_renderDataSource","_applyEvents","find","fadeIn","_triggerEvent","currentYear","header","document","createElement","headerBody","headerTable","prevDiv","prevIcon","append","prev2YearDiv","text","prevYearDiv","yearDiv","nextYearDiv","next2YearDiv","nextDiv","nextIcon","monthsDiv","bsRow","monthDiv","data","firstDate","table","thead","titleRow","titleCell","attr","months","headerRow","weekNumberCell","weekShort","headerCell","daysMin","_isHidden","currentDate","getTime","lastDate","getDay","setDate","getDate","row","getWeekNumber","cell","_isDisabled","cellContent","_this","each","month","monthData","startDate","endDate","push","nextDate","dayData","_renderDataSourceDay","elt","events","weight","parent","css","boxShadow","currentTime","startHalfDay","otherColor","endHalfDay","click","hasClass","animate","margin-left","setTimeout","cells","stopPropagation","date","_getDate","which","getEvents","preventDefault","_openContextMenu","mousedown","_mouseDown","_rangeStart","_rangeEnd","_refreshRange","mouseenter","newDate","getMonth","oldValue","mouseup","getEventsOnRange","mouseleave","setInterval","calendarSize","width","monthSize","first","monthContainerClass","removeClass","monthId","contextMenu","eventItem","eventItemContent","icon","_renderContextMenuItems","children","offset","left","top","show","one","items","evt","subMenu","visible","menuItem","menuItemContent","index","_getColor","colorString","day","closest","year","eventName","parameters","event","Event","trigger","tempDate","setHours","week1","round","getYear","parsedYear","preventRendering","getMinDate","setMinDate","getMaxDate","setMaxDate","getStyle","setStyle","getAllowOverlap","setAllowOverlap","getDisplayWeekNumber","setDisplayWeekNumber","getDisplayHeader","setDisplayHeader","getDisplayDisabledDataSource","setDisplayDisabledDataSource","getAlwaysHalfDay","setAlwaysHalfDay","getEnableRangeSelection","setEnableRangeSelection","getDisabledDays","setDisabledDays","getDisabledWeekDays","setDisabledWeekDays","getHiddenWeekDays","setHiddenWeekDays","getRoundRangeLimits","setRoundRangeLimits","getEnableContextMenu","setEnableContextMenu","getContextMenuItems","setContextMenuItems","getCustomDayRenderer","setCustomDayRenderer","getCustomDataSourceRenderer","setCustomDataSourceRenderer","getLanguage","setLanguage","getDataSource","setDataSource","getWeekStart","setWeekStart","addEvent","calendar","fct","en","days","daysShort","monthsShort","jQuery","exec","isObject","is","version","__e","bitmap","configurable","writable","ascending","NaN","bisector","compare","x","lo","hi","mid","right","ascendingBisect","bisectRight","bisect","src_extent","values","valueof","min","max","array_array","slice","constant","map","identity","src_range","start","stop","step","ceil","range","e10","sqrt","e5","e2","ticks","count","reverse","tickIncrement","isFinite","floor","power","log","LN10","error","pow","tickStep","step0","abs","step1","sturges","LN2","src_histogram","domain","threshold","histogram","xz","x0","x1","tz","isArray","shift","pop","bin","bins","_","thresholds","src_max","src_merge","arrays","merged","array","j","array_slice","src_identity","axis_top","axis_right","axis_bottom","axis_left","epsilon","translateX","translateY","y","entering","__axis","axis_axis","orient","scale","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","k","transform","axis","context","format","spacing","range0","range1","position","bandwidth","copy","selection","path","selectAll","tick","order","tickExit","exit","tickEnter","enter","line","select","merge","insert","transition","getAttribute","parentNode","remove","filter","tickSize","axisLeft","noop","dispatch","Error","Dispatch","set","callback","concat","on","typename","types","T","trim","split","indexOf","args","src_dispatch","xhtml","namespaces","svg","xlink","xml","xmlns","namespace","prefix","space","local","creator","fullname","ownerDocument","createElementNS","uri","namespaceURI","documentElement","none","src_selector","selector","querySelector","selectorAll_empty","selectorAll","querySelectorAll","matcher","matches","matcher_element","vendorMatches","webkitMatchesSelector","msMatchesSelector","mozMatchesSelector","oMatchesSelector","src_matcher","sparse","update","EnterNode","datum","_next","_parent","__data__","appendChild","child","insertBefore","next","bindIndex","group","node","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","keyValues","sort_ascending","src_window","defaultView","styleValue","getPropertyValue","getComputedStyle","classArray","string","classList","ClassList","_node","_names","classedAdd","names","list","add","classedRemove","setAttribute","join","splice","contains","textRemove","textContent","htmlRemove","innerHTML","raise","nextSibling","lower","previousSibling","firstChild","constantNull","removeChild","selection_cloneShallow","cloneNode","selection_cloneDeep","filterEvents","on_event","filterContextListener","listener","contextListener","related","relatedTarget","compareDocumentPosition","event1","event0","onRemove","__on","removeEventListener","capture","onAdd","wrap","addEventListener","dispatchEvent","params","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","selection_root","Selection","groups","parents","_groups","_parents","selection_selection","subgroups","subnode","subgroup","match","size","enterGroup","updateGroup","previous","i0","i1","_enter","_exit","groups0","groups1","m0","m1","merges","group0","group1","sort","compareNode","sortgroups","sortgroup","nodes","getAttributeNS","removeAttributeNS","removeAttribute","v","setAttributeNS","priority","removeProperty","setProperty","classed","html","before","clone","deep","typenames","src_selection","src_select","nextId","Local","toString","id","extend","definition","Color","brighter","reI","reN","reP","reHex3","reHex6","reRgbInteger","RegExp","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_color","toLowerCase","Rgb","rgbn","rgba","hsla","g","rgbConvert","rgb","opacity","color_rgb","hex","h","Hsl","hsl","hslConvert","hsl2rgb","m2","displayable","darker","deg2rad","PI","rad2deg","Xn","Yn","Zn","lab_t0","lab_t1","lab_t2","t3","labConvert","Lab","Hcl","cos","sin","z","rgb2lrgb","xyz2lab","lab","lab2xyz","lrgb2rgb","hclConvert","atan2","hcl","cubehelix_B","cubehelix_D","cubehelix_E","ED","EB","BC_DA","cubehelix_cubehelix","Cubehelix","bl","cubehelixConvert","basis","t1","v0","v1","v2","v3","t2","cosh","sinh","d3_interpolate_src_constant","linear","color_hue","gamma","nogamma","src_rgb","rgbGamma","end","rgbSpline","spline","rgbBasis","src_number","reA","reB","cssNode","cssRoot","cssView","svgNode","src_string","am","bm","bs","bi","lastIndex","q","src_value","setTime","nb","na","valueOf","src_round","degrees","decompose_identity","rotate","skewX","scaleX","scaleY","decompose","atan","interpolateTransform","parse","pxComma","pxParen","degParen","xa","ya","xb","yb","translate","interpolateTransformCss","interpolateTransformSvg","baseVal","consolidate","matrix","SQRT2","hsl_hsl","hue","hcl_hcl","src_cubehelix_cubehelix","cubehelixGamma","cubehelix","cubehelixLong","taskHead","taskTail","timer_frame","timeout","timer_interval","pokeDelay","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","timer_now","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","timerFlush","t0","Infinity","sleep","nap","poke","clearTimeout","clearInterval","src_timeout","elapsed","emptyOn","emptyTween","CREATED","STARTING","transition_schedule","timing","schedules","__transition","tween","state","duration","ease","schedule_create","schedule_init","schedule","schedule_get","schedule_set","interrupt","active","tweenValue","_id","transition_interpolate","selection_Selection","transition_id","Transition","_name","newId","selection_prototype","inherit","id0","id1","on0","on1","sit","every","attrTween","interpolate","value00","value10","interpolate0","value0","value1","_value","styleTween","tween0","tween1","easeConstant","custom","polyIn","exponent","polyOut","polyInOut","overshoot","tau","backIn","backOut","backInOut","defaultTiming","asin","elasticIn","amplitude","period","elasticOut","elasticInOut","transition_inherit","brush_type","path_pi","path_tau","path_epsilon","tauEpsilon","Path","_x0","_y0","_x1","_y1","moveTo","closePath","lineTo","quadraticCurveTo","y1","bezierCurveTo","x2","y2","arcTo","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","acos","t01","t21","arc","a0","a1","ccw","dx","dy","cw","da","rect","w","map_prefix","Map","map_map","clear","keys","entries","src_map","src_nest","sortValues","rollup","nest","sortKeys","depth","createResult","setResult","valuesByKey","result","createObject","setObject","createMap","setMap","sortKey","Set","proto","EOL","EOF","objectConverter","columns","JSON","stringify","dsv","delimiter","reFormat","DELIMITER","charCodeAt","parseRows","rows","N","I","eof","eol","token","replace","formatRow","formatValue","test","convert","columnSet","forEach","column","formatRows","csv","csvParse","tsv","tsvParse","responseText","response","ok","status","statusText","src_text","input","init","fetch","then","dsvParse","parser","DOMParser","parseFromString","add_add","tree","xm","ym","xp","yp","bottom","_root","leaf","_x","_y","src_quad","Quadtree","leaf_copy","treeProto","cover","addAll","yz","visit","extent","radius","x3","y3","quads","d2","retainer","removeAll","visitAfter","formatDecimal","toExponential","coefficient","src_exponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","sign","symbol","zero","comma","precision","prefixExponent","defaultLocale_locale","defaultLocale_format","defaultLocale_formatPrefix","formatRounded","formatTypes","%","toFixed","toPrecision","X","toUpperCase","d3_format_src_identity","prefixes","locale","numerals","grouping","thousands","substring","currency","decimal","percent","newFormat","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatTrim","padding","formatPrefix","src_locale","adder","Adder","reset","adder_add","temp","bv","av","math_epsilon","src_math_pi","src_math_halfPi","quarterPi","src_math_tau","radians","math_cos","exp","math_sin","noop_noop","cartesian_cartesian","spherical","lambda","phi","cosPhi","cartesianCross","cartesianNormalizeInPlace","rotationIdentity","invert","clip_buffer","lines","point","lineStart","lineEnd","rejoin","pointEqual","Intersection","points","other","entry","segments","compareIntersection","startInside","stream","subject","clip","segment","p0","p1","rejoin_link","current","isSubject","polygonContains_sum","polygonContains","polygon","sinPhi","normal","angle","winding","ring","point0","lambda0","phi0","sinPhi0","cosPhi0","lambda1","sinPhi1","cosPhi1","point1","phi1","delta","absDelta","antimeridian","intersection","phiArc","src_clip","pointVisible","clipLine","sink","ringBuffer","ringSink","polygonStarted","polygonStart","pointRing","ringStart","ringEnd","polygonEnd","clip_compareIntersection","sphere","pointLine","clean","ringSegments","validSegment","sign0","sinLambda0Lambda1","sign1","from","to","direction","string_circle","transformer","methods","TransformStream","azimuthalRaw","cx","cy","azimuthalInvert","sc","cc","azimuthalEqualAreaRaw","cxcy","azimuthalEquidistantRaw","equirectangularRaw","A1","A2","A3","A4","M","count_count","sum","hierarchy","childs","Node","valued","defaultChildren","eachBefore","computeHeight","copyData","height","eachAfter","ancestor","aNodes","ancestors","bNodes","leastCommonAncestor","descendants","leaves","links","dice","treemap_slice","squarify_phi","squarifyRatio","ratio","nodeValue","sumValue","minValue","maxValue","newRatio","minRatio","alpha","beta","squarify","resquarify","_squarify","src_defaultSource","random","src_normal","sourceRandomUniform","randomUniform","sourceRandomNormal","randomNormal","mu","sigma","irwinHall","sourceRandomLogNormal","randomLogNormal","sourceRandomIrwinHall","randomIrwinHall","d3_scale_src_array_array","sourceRandomBates","randomBates","sourceRandomExponential","randomExponential","array_map","d3_scale_src_array_slice","implicit","ordinal","unknown","d3_scale_src_constant","d3_scale_src_number","unit","deinterpolateLinear","bimap","deinterpolate","reinterpolate","d0","d1","r0","r1","polymap","clamp","continuous","piecewise","output","rescale","rangeRound","src_tickFormat","linearish","nice","interval","interval_t0","interval_t1","newInterval","floori","offseti","field","millisecond_millisecond","src_millisecond","durationMinute","durationHour","second_second","getUTCSeconds","src_second","minute_minute","getMinutes","src_minute","hour_hour","getTimezoneOffset","getHours","src_hour","day_day","src_day","weekday","sunday","monday","tuesday","wednesday","thursday","friday","saturday","month_month","setMonth","src_month","year_year","setFullYear","src_year","years","utcMinute","setUTCSeconds","getUTCMinutes","utcHour","setUTCMinutes","getUTCHours","utcDay","setUTCHours","setUTCDate","getUTCDate","src_utcDay","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcMonth","setUTCMonth","getUTCMonth","getUTCFullYear","utcYear","setUTCFullYear","src_utcYear","localDate","H","L","utcDate","UTC","newYear","src_defaultLocale_locale","timeFormat","utcFormat","utcParse","pads","-","0","numberRe","percentRe","requoteRe","pad","requote","formatRe","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","u","parseWeekNumberSunday","parseWeekNumberISO","V","parseWeekNumberMonday","parseFullYear","parseYear","parseZone","Z","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","getMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","getSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","locale_formatYear","formatFullYear","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","locale_shortWeekdays","shortDays","locale_months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","A","Y","utcFormats","parses","parseSpecifier","charAt","newParse","week","formatLocale","isoSpecifier","toISOString","time_durationSecond","time_durationMinute","time_durationHour","time_durationDay","time_durationWeek","durationMonth","durationYear","time_date","time_number","hour","minute","second","millisecond","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","formatYear","tickIntervals","tickInterval","src_time","src_colors","ramp","scheme","viridis_ramp","d3_shape_src_constant","src_math_epsilon","d3_shape_src_math_pi","d3_shape_src_math_tau","Linear","_context","areaStart","_line","areaEnd","_point","curve_linear","curveRadial","Radial","curve","_curve","radial","d3_shape_src_array_slice","kr","d3_shape_src_noop","basis_point","Basis","Bundle","_basis","_beta","bundle","cardinal_point","_k","_x2","_y2","Cardinal","tension","cardinal","CardinalClosed","_x3","_x4","_x5","_y3","_y4","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","_l23_2a","CatmullRom","_alpha","x23","y23","catmullRom","CatmullRomClosed","CatmullRomOpen","monotone_sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","controlPoints","_t0","offset_none","series","order_none","stackValue","src_stack","stack","oz","kz","sz","sij","ki","si","RedBlackTree","RedBlackNode","RedBlackRotateLeft","RedBlackRotateRight","RedBlackFirst","after","grandpa","uncle","sibling","src_RedBlackTree","createEdge","edge","Diagram_edges","setEdgeEnd","halfedges","createBorderEdge","vertex","clipEdge","ax","ay","connectEdge","fm","fb","lx","ly","rx","ry","fx","fy","cellHalfedgeStart","site","firstCircle","circlePool","Circle","attachCircle","lArc","rArc","lSite","cSite","rSite","bx","by","Diagram_epsilon2","ha","hc","circle","Diagram_circles","detachCircle","beachPool","Beach","createBeach","beach","detachBeach","beaches","removeBeach","disappearing","Diagram_epsilon","unshift","iArc","nArcs","addBeach","dxl","dxr","directrix","leftBreakPoint","rightBreakPoint","newArc","hb","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","lexicographic","Diagram","sites","vb","va","sortCellHalfedges","clipEdges","iCell","iHalfedge","nHalfedges","startX","startY","endX","endY","nCells","dc","v00","v01","v11","v10","clipCells","edges","polygons","triangles","e1","_found","vx","vy","Transform","applyX","applyY","location","invertX","invertY","rescaleX","rescaleY","createVisitsHistogram","container","visitsData","yearClickCallback","d3","margin","tooltip","src_linear_linear","endYear","monthExtent","monthBins","yearBins","binByMonth","visitsByStatus","statuses","histData","monthsData","stacked","yMax","total","yTickValues","ds","substr","tooltipText","visitStatus","nbVisits","pageX","pageY","legendGroup","legend","minSize","maxSize","currentPopover","visitsByDate","closePopover","popover","updateCalendar","filteredVisits","yearClickedCallback","maxNbVisitsByDate","dateStr","toDateString","offsetX","parse_int_default","offsetY","cellWrapper","dayNumber","outerHTML","visits","content","visitTime","fmt_date","browse_url","allVisits","filterFullVisits","differentSnapshots","lastVisit","snapshot","updateVisitsList","visitsByYear","visitsCpt","visitsListHtml","yearChangedCalendar","yearClickedTimeline","updateDisplayedVisits","showFullVisitsDifferentSnapshots","showFullVisits","showAllVisits","initVisitsReporting","ready","firstFullVisit","visitLink","__webpack_exports__","val","$parseInt","$trim","ws","str","radix","String","defined","fails","spaces","ltrim","rtrim","exporter","KEY","ALIAS","FORCE","TYPE","createDesc"],"mappings":"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A,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCASC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA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","file":"js/origin.245751215322daa84934.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"origin\"] = factory();\n\telse\n\t\troot[\"swh\"] = root[\"swh\"] || {}, root[\"swh\"][\"origin\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 227);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = require(\"core-js/library/fn/parse-int\");","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","/* =========================================================\n * Bootstrap year calendar v1.1.0\n * Repo: https://github.com/Paul-DS/bootstrap-year-calendar\n * =========================================================\n * BOOTSTRAP 4 Integration by Raul Neiva\n * =========================================================\n * Created by Paul David-Sivelle\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n \n (function($) {\n\tvar Calendar = function(element, options) {\n\t\tthis.element = element;\n\t\tthis.element.addClass('calendar');\n\t\t\n\t\tthis._initializeEvents(options);\n\t\tthis._initializeOptions(options);\n\t\tthis.setYear(this.options.startYear);\n\t};\n \n\tCalendar.prototype = {\n\t\tconstructor: Calendar,\n\t\t_initializeOptions: function(opt) {\n\t\t\tif(opt == null) {\n\t\t\t\topt = [];\n\t\t\t}\n\t\t\n\t\t\tthis.options = {\n\t\t\t\tstartYear: !isNaN(parseInt(opt.startYear)) ? parseInt(opt.startYear) : new Date().getFullYear(),\n\t\t\t\tminDate: opt.minDate instanceof Date ? opt.minDate : null,\n\t\t\t\tmaxDate: opt.maxDate instanceof Date ? opt.maxDate : null,\n\t\t\t\tlanguage: (opt.language != null && dates[opt.language] != null) ? opt.language : 'en',\n\t\t\t\tallowOverlap: opt.allowOverlap != null ? opt.allowOverlap : true,\n\t\t\t\tdisplayWeekNumber: opt.displayWeekNumber != null ? opt.displayWeekNumber : false,\n\t\t\t\tdisplayDisabledDataSource: opt.displayDisabledDataSource != null ? opt.displayDisabledDataSource : false,\n\t\t\t\tdisplayHeader: opt.displayHeader != null ? opt.displayHeader : true,\n\t\t\t\talwaysHalfDay: opt.alwaysHalfDay != null ? opt.alwaysHalfDay : false,\n\t\t\t\tenableRangeSelection: opt.enableRangeSelection != null ? opt.enableRangeSelection : false,\n\t\t\t\tdisabledDays: opt.disabledDays instanceof Array ? opt.disabledDays : [],\n\t\t\t\tdisabledWeekDays: opt.disabledWeekDays instanceof Array ? opt.disabledWeekDays : [],\n\t\t\t\thiddenWeekDays: opt.hiddenWeekDays instanceof Array ? opt.hiddenWeekDays : [],\n\t\t\t\troundRangeLimits: opt.roundRangeLimits != null ? opt.roundRangeLimits : false,\n\t\t\t\tdataSource: opt.dataSource instanceof Array ? opt.dataSource : [],\n\t\t\t\tstyle: opt.style == 'background' || opt.style == 'border' || opt.style == 'custom' ? opt.style : 'border',\n\t\t\t\tenableContextMenu: opt.enableContextMenu != null ? opt.enableContextMenu : false,\n\t\t\t\tcontextMenuItems: opt.contextMenuItems instanceof Array ? opt.contextMenuItems : [],\n\t\t\t\tcustomDayRenderer : $.isFunction(opt.customDayRenderer) ? opt.customDayRenderer : null,\n\t\t\t\tcustomDataSourceRenderer : $.isFunction(opt.customDataSourceRenderer) ? opt.customDataSourceRenderer : null,\n\t\t\t\tweekStart: !isNaN(parseInt(opt.weekStart)) ? parseInt(opt.weekStart) : null\n\t\t\t};\n\t\t\t\n\t\t\tthis._initializeDatasourceColors();\n\t\t},\n\t\t_initializeEvents: function(opt) {\n\t\t\tif(opt == null) {\n\t\t\t\topt = [];\n\t\t\t}\n\t\t\n\t\t\tif(opt.yearChanged) { this.element.bind('yearChanged', opt.yearChanged); }\n\t\t\tif(opt.renderEnd) { this.element.bind('renderEnd', opt.renderEnd); }\n\t\t\tif(opt.clickDay) { this.element.bind('clickDay', opt.clickDay); }\n\t\t\tif(opt.dayContextMenu) { this.element.bind('dayContextMenu', opt.dayContextMenu); }\n\t\t\tif(opt.selectRange) { this.element.bind('selectRange', opt.selectRange); }\n\t\t\tif(opt.mouseOnDay) { this.element.bind('mouseOnDay', opt.mouseOnDay); }\n\t\t\tif(opt.mouseOutDay) { this.element.bind('mouseOutDay', opt.mouseOutDay); }\n\t\t},\n\t\t_initializeDatasourceColors: function() {\n\t\t\tfor(var i = 0; i < this.options.dataSource.length; i++) {\n\t\t\t\tif(this.options.dataSource[i].color == null) {\n\t\t\t\t\tthis.options.dataSource[i].color = colors[i % colors.length];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\trender: function() {\n\t\t\tthis.element.empty();\n\t\t\t\n\t\t\tif(this.options.displayHeader) {\n\t\t\t\tthis._renderHeader();\n\t\t\t}\n\t\t\t\n\t\t\tthis._renderBody();\n\t\t\tthis._renderDataSource();\n\t\t\t\n\t\t\tthis._applyEvents();\n\t\t\tthis.element.find('.months-container').fadeIn(500);\n\t\t\t\n\t\t\tthis._triggerEvent('renderEnd', { currentYear: this.options.startYear });\n\t\t},\n\t\t_renderHeader: function() {\n\t\t\tvar header = $(document.createElement('div'));\n\t\t\theader.addClass('calendar-header card');\n\n\t\t\tvar headerBody = $(document.createElement('div'));\n\t\t\theaderBody.addClass('card-body p-0');\n\t\t\t\n\t\t\tvar headerTable = $(document.createElement('table'));\n\t\t\t\n\t\t\tvar prevDiv = $(document.createElement('th'));\n\t\t\tprevDiv.addClass('prev');\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {\n\t\t\t\tprevDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\tvar prevIcon = $(document.createElement('span'));\n\t\t\tprevIcon.addClass('oi oi-chevron-left');\n\t\t\t\n\t\t\tprevDiv.append(prevIcon);\n\t\t\t\n\t\t\theaderTable.append(prevDiv);\n\t\t\t\n\t\t\tvar prev2YearDiv = $(document.createElement('th'));\n\t\t\tprev2YearDiv.addClass('year-title year-neighbor2 d-none d-md-table-cell');\n\t\t\tprev2YearDiv.text(this.options.startYear - 2);\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 2, 11, 31)) {\n\t\t\t\tprev2YearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(prev2YearDiv);\n\t\t\t\n\t\t\tvar prevYearDiv = $(document.createElement('th'));\n\t\t\tprevYearDiv.addClass('year-title year-neighbor d-none d-sm-table-cell');\n\t\t\tprevYearDiv.text(this.options.startYear - 1);\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {\n\t\t\t\tprevYearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(prevYearDiv);\n\t\t\t\n\t\t\tvar yearDiv = $(document.createElement('th'));\n\t\t\tyearDiv.addClass('year-title');\n\t\t\tyearDiv.text(this.options.startYear);\n\t\t\t\n\t\t\theaderTable.append(yearDiv);\n\t\t\t\n\t\t\tvar nextYearDiv = $(document.createElement('th'));\n\t\t\tnextYearDiv.addClass('year-title year-neighbor d-none d-sm-table-cell');\n\t\t\tnextYearDiv.text(this.options.startYear + 1);\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {\n\t\t\t\tnextYearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(nextYearDiv);\n\t\t\t\n\t\t\tvar next2YearDiv = $(document.createElement('th'));\n\t\t\tnext2YearDiv.addClass('year-title year-neighbor2 d-none d-md-table-cell');\n\t\t\tnext2YearDiv.text(this.options.startYear + 2);\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 2, 0, 1)) {\n\t\t\t\tnext2YearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(next2YearDiv);\n\t\t\t\n\t\t\tvar nextDiv = $(document.createElement('th'));\n\t\t\tnextDiv.addClass('next');\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {\n\t\t\t\tnextDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\tvar nextIcon = $(document.createElement('span'));\n\t\t\tnextIcon.addClass('oi oi-chevron-right');\n\t\t\t\n\t\t\tnextDiv.append(nextIcon);\n\t\t\t\n\t\t\theaderTable.append(nextDiv);\n\t\t\t\n\t\t\theaderBody.append(headerTable);\n\n\t\t\theader.append(headerBody);\n\t\t\t\n\t\t\tthis.element.append(header);\n\t\t},\n\t\t_renderBody: function() {\n\t\t\tvar monthsDiv = $(document.createElement('div'));\n\t\t\tmonthsDiv.addClass('months-container');\n\n\t\t\tvar bsRow = $(document.createElement('div'));\n\t\t\tbsRow.addClass('row m-0');\n\n\t\t\tmonthsDiv.append(bsRow);\n\t\t\t\n\t\t\tfor(var m = 0; m < 12; m++) {\n\t\t\t\t/* Container */\n\t\t\t\tvar monthDiv = $(document.createElement('div'));\n\t\t\t\tmonthDiv.addClass('month-container');\n\t\t\t\tmonthDiv.data('month-id', m);\n\t\t\t\t\n\t\t\t\tvar firstDate = new Date(this.options.startYear, m, 1);\n\t\t\t\t\n\t\t\t\tvar table = $(document.createElement('table'));\n\t\t\t\ttable.addClass('month');\n\t\t\t\t\n\t\t\t\t/* Month header */\n\t\t\t\tvar thead = $(document.createElement('thead'));\n\t\t\t\t\n\t\t\t\tvar titleRow = $(document.createElement('tr'));\n\t\t\t\t\n\t\t\t\tvar titleCell = $(document.createElement('th'));\n\t\t\t\ttitleCell.addClass('month-title');\n\t\t\t\ttitleCell.attr('colspan', this.options.displayWeekNumber ? 8 : 7);\n\t\t\t\ttitleCell.text(dates[this.options.language].months[m]);\n\t\t\t\t\n\t\t\t\ttitleRow.append(titleCell);\n\t\t\t\tthead.append(titleRow);\n\t\t\t\t\n\t\t\t\tvar headerRow = $(document.createElement('tr'));\n\t\t\t\t\n\t\t\t\tif(this.options.displayWeekNumber) {\n\t\t\t\t\tvar weekNumberCell = $(document.createElement('th'));\n\t\t\t\t\tweekNumberCell.addClass('week-number');\n\t\t\t\t\tweekNumberCell.text(dates[this.options.language].weekShort);\n\t\t\t\t\theaderRow.append(weekNumberCell);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar weekStart = this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;\n\t\t\t\tvar d = weekStart;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tvar headerCell = $(document.createElement('th'));\n\t\t\t\t\theaderCell.addClass('day-header');\n\t\t\t\t\theaderCell.text(dates[this.options.language].daysMin[d]);\n\t\t\t\t\t\n\t\t\t\t\tif(this._isHidden(d)) {\n\t\t\t\t\t\theaderCell.addClass('hidden');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\theaderRow.append(headerCell);\n\t\t\t\t\t\n\t\t\t\t\td++;\n\t\t\t\t\tif(d >= 7)\n\t\t\t\t\t\td = 0;\n\t\t\t\t}\n\t\t\t\twhile(d != weekStart)\n\t\t\t\t\n\t\t\t\tthead.append(headerRow);\n\t\t\t\ttable.append(thead);\n\t\t\t\t\n\t\t\t\t/* Days */\n\t\t\t\tvar currentDate = new Date(firstDate.getTime());\n\t\t\t\tvar lastDate = new Date(this.options.startYear, m + 1, 0);\n\t\t\t\t\n\t\t\t\twhile(currentDate.getDay() != weekStart)\n\t\t\t\t{\n\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() - 1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(currentDate <= lastDate)\n\t\t\t\t{\n\t\t\t\t\tvar row = $(document.createElement('tr'));\n\t\t\t\t\t\n\t\t\t\t\tif(this.options.displayWeekNumber) {\n\t\t\t\t\t\tvar weekNumberCell = $(document.createElement('td'));\n\t\t\t\t\t\tweekNumberCell.addClass('week-number');\n\t\t\t\t\t\tweekNumberCell.text(this.getWeekNumber(currentDate));\n\t\t\t\t\t\trow.append(weekNumberCell);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\tvar cell = $(document.createElement('td'));\n\t\t\t\t\t\tcell.addClass('day');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this._isHidden(currentDate.getDay())) {\n\t\t\t\t\t\t\tcell.addClass('hidden');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(currentDate < firstDate) {\n\t\t\t\t\t\t\tcell.addClass('old');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(currentDate > lastDate) {\n\t\t\t\t\t\t\tcell.addClass('new');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif(this._isDisabled(currentDate)) {\n\t\t\t\t\t\t\t\tcell.addClass('disabled');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar cellContent = $(document.createElement('div'));\n\t\t\t\t\t\t\tcellContent.addClass('day-content');\n\t\t\t\t\t\t\tcellContent.text(currentDate.getDate());\n\t\t\t\t\t\t\tcell.append(cellContent);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(this.options.customDayRenderer) {\n\t\t\t\t\t\t\t\tthis.options.customDayRenderer(cellContent, currentDate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\trow.append(cell);\n\t\t\t\t\t\t\n\t\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t\t\t\t\t}\n\t\t\t\t\twhile(currentDate.getDay() != weekStart)\n\t\t\t\t\t\n\t\t\t\t\ttable.append(row);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmonthDiv.append(table);\n\t\t\t\t\n\t\t\t\tbsRow.append(monthDiv);\n\t\t\t}\n\t\t\t\n\t\t\tthis.element.append(monthsDiv);\n\t\t},\n\t\t_renderDataSource: function() {\n\t\t\tvar _this = this;\n\t\t\tif(this.options.dataSource != null && this.options.dataSource.length > 0) {\n\t\t\t\tthis.element.find('.month-container').each(function() {\n\t\t\t\t\tvar month = $(this).data('month-id');\n\t\t\t\t\t\n\t\t\t\t\tvar firstDate = new Date(_this.options.startYear, month, 1);\n\t\t\t\t\tvar lastDate = new Date(_this.options.startYear, month + 1, 1);\n\t\t\t\t\t\n\t\t\t\t\tif((_this.options.minDate == null || lastDate > _this.options.minDate) && (_this.options.maxDate == null || firstDate <= _this.options.maxDate))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar monthData = [];\n\t\t\t\t\t\n\t\t\t\t\t\tfor(var i = 0; i < _this.options.dataSource.length; i++) {\n\t\t\t\t\t\t\tif(!(_this.options.dataSource[i].startDate >= lastDate) || (_this.options.dataSource[i].endDate < firstDate)) {\n\t\t\t\t\t\t\t\tmonthData.push(_this.options.dataSource[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(monthData.length > 0) {\n\t\t\t\t\t\t\t$(this).find('.day-content').each(function() {\n\t\t\t\t\t\t\t\tvar currentDate = new Date(_this.options.startYear, month, $(this).text());\n\t\t\t\t\t\t\t\tvar nextDate = new Date(_this.options.startYear, month, currentDate.getDate() + 1);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar dayData = [];\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif((_this.options.minDate == null || currentDate >= _this.options.minDate) && (_this.options.maxDate == null || currentDate <= _this.options.maxDate))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfor(var i = 0; i < monthData.length; i++) {\n\t\t\t\t\t\t\t\t\t\tif(monthData[i].startDate < nextDate && monthData[i].endDate >= currentDate) {\n\t\t\t\t\t\t\t\t\t\t\tdayData.push(monthData[i]);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif(dayData.length > 0 && (_this.options.displayDisabledDataSource || !_this._isDisabled(currentDate)))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t_this._renderDataSourceDay($(this), currentDate, dayData);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_renderDataSourceDay: function(elt, currentDate, events) {\n\t\t\tswitch(this.options.style)\n\t\t\t{\n\t\t\t\tcase 'border':\n\t\t\t\t\tvar weight = 0;\n\t\t\t\n\t\t\t\t\tif(events.length == 1) {\n\t\t\t\t\t\tweight = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(events.length <= 3) {\n\t\t\t\t\t\tweight = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\telt.parent().css('box-shadow', 'inset 0 -4px 0 0 black');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(weight > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar boxShadow = '';\n\t\t\t\t\t\n\t\t\t\t\t\tfor (var i = 0; i < events.length; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(boxShadow != '') {\n\t\t\t\t\t\t\t\tboxShadow += \",\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tboxShadow += 'inset 0 -' + (parseInt(i) + 1) * weight + 'px 0 0 ' + events[i].color;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\telt.parent().css('box-shadow', boxShadow);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\tcase 'background':\n\t\t\t\t\telt.parent().css('background-color', events[events.length - 1].color);\n\t\t\t\t\t\n\t\t\t\t\tvar currentTime = currentDate.getTime();\n\t\t\t\t\t\n\t\t\t\t\tif(events[events.length - 1].startDate.getTime() == currentTime)\n\t\t\t\t\t{\n\t\t\t\t\t\telt.parent().addClass('day-start');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(events[events.length - 1].startHalfDay || this.options.alwaysHalfDay) {\n\t\t\t\t\t\t\telt.parent().addClass('day-half');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Find color for other half\n\t\t\t\t\t\t\tvar otherColor = 'transparent';\n\t\t\t\t\t\t\tfor(var i = events.length - 2; i >= 0; i--) {\n\t\t\t\t\t\t\t\tif(events[i].startDate.getTime() != currentTime || (!events[i].startHalfDay && !this.options.alwaysHalfDay)) {\n\t\t\t\t\t\t\t\t\totherColor = events[i].color;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telt.parent().css('background', 'linear-gradient(-45deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.options.roundRangeLimits) {\n\t\t\t\t\t\t\telt.parent().addClass('round-left');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(events[events.length - 1].endDate.getTime() == currentTime)\n\t\t\t\t\t{\n\t\t\t\t\t\telt.parent().addClass('day-end');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(events[events.length - 1].endHalfDay || this.options.alwaysHalfDay) {\n\t\t\t\t\t\t\telt.parent().addClass('day-half');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Find color for other half\n\t\t\t\t\t\t\tvar otherColor = 'transparent';\n\t\t\t\t\t\t\tfor(var i = events.length - 2; i >= 0; i--) {\n\t\t\t\t\t\t\t\tif(events[i].endDate.getTime() != currentTime || (!events[i].endHalfDay && !this.options.alwaysHalfDay)) {\n\t\t\t\t\t\t\t\t\totherColor = events[i].color;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telt.parent().css('background', 'linear-gradient(135deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.options.roundRangeLimits) {\n\t\t\t\t\t\t\telt.parent().addClass('round-right');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'custom':\n\t\t\t\t\tif(this.options.customDataSourceRenderer) {\n\t\t\t\t\t\tthis.options.customDataSourceRenderer.call(this, elt, currentDate, events);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t_applyEvents: function () {\n\t\t\tvar _this = this;\n\t\t\t\n\t\t\t/* Header buttons */\n\t\t\tthis.element.find('.year-neighbor, .year-neighbor2').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.setYear(parseInt($(this).text()));\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.element.find('.calendar-header .prev').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.element.find('.months-container').animate({'margin-left':'100%'},100, function() {\n\t\t\t\t\t\t_this.element.find('.months-container').css('visibility', 'hidden');\n\t\t\t\t\t\t_this.element.find('.months-container').css('margin-left', '0');\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetTimeout(function() { \n\t\t\t\t\t\t\t_this.setYear(_this.options.startYear - 1);\n\t\t\t\t\t\t}, 50);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.element.find('.calendar-header .next').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.element.find('.months-container').animate({'margin-left':'-100%'},100, function() {\n\t\t\t\t\t\t_this.element.find('.months-container').css('visibility', 'hidden');\n\t\t\t\t\t\t_this.element.find('.months-container').css('margin-left', '0');\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetTimeout(function() { \n\t\t\t\t\t\t\t_this.setYear(_this.options.startYear + 1);\n\t\t\t\t\t\t}, 50);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tvar cells = this.element.find('.day:not(.old, .new, .disabled)');\n\t\t\t\n\t\t\t/* Click on date */\n\t\t\tcells.click(function(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('clickDay', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\twhich: e.which,\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Click right on date */\n\t\t\t\n\t\t\tcells.bind('contextmenu', function(e) {\n\t\t\t\tif(_this.options.enableContextMenu)\n\t\t\t\t{\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif(_this.options.contextMenuItems.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_this._openContextMenu($(this));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('dayContextMenu', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Range selection */\n\t\t\tif(this.options.enableRangeSelection) {\n\t\t\t\tcells.mousedown(function (e) {\n\t\t\t\t\tif(e.which == 1) {\n\t\t\t\t\t\tvar currentDate = _this._getDate($(this));\n\t\t\t\t\t\n\t\t\t\t\t\tif(_this.options.allowOverlap || _this.getEvents(currentDate).length == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_this._mouseDown = true;\n\t\t\t\t\t\t\t_this._rangeStart = _this._rangeEnd = currentDate;\n\t\t\t\t\t\t\t_this._refreshRange();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tcells.mouseenter(function (e) {\n\t\t\t\t\tif (_this._mouseDown) {\n\t\t\t\t\t\tvar currentDate = _this._getDate($(this));\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(!_this.options.allowOverlap)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar newDate = new Date(_this._rangeStart.getTime());\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(newDate < currentDate) {\n\t\t\t\t\t\t\t\tvar nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() + 1);\n\t\t\t\t\t\t\t\twhile(newDate < currentDate) {\n\t\t\t\t\t\t\t\t\tif(_this.getEvents(nextDate).length > 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tnewDate.setDate(newDate.getDate() + 1);\n\t\t\t\t\t\t\t\t\tnextDate.setDate(nextDate.getDate() + 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() - 1);\n\t\t\t\t\t\t\t\twhile(newDate > currentDate) {\n\t\t\t\t\t\t\t\t\tif(_this.getEvents(nextDate).length > 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tnewDate.setDate(newDate.getDate() - 1);\n\t\t\t\t\t\t\t\t\tnextDate.setDate(nextDate.getDate() - 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcurrentDate = newDate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\tvar oldValue = _this._rangeEnd;\n\t\t\t\t\t\t_this._rangeEnd = currentDate;\n\n\t\t\t\t\t\tif (oldValue.getTime() != _this._rangeEnd.getTime()) {\n\t\t\t\t\t\t\t_this._refreshRange();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t$(window).mouseup(function (e) {\n\t\t\t\t\tif (_this._mouseDown) {\n\t\t\t\t\t\t_this._mouseDown = false;\n\t\t\t\t\t\t_this._refreshRange();\n\n\t\t\t\t\t\tvar minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;\n\t\t\t\t\t\tvar maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;\n\n\t\t\t\t\t\t_this._triggerEvent('selectRange', { \n\t\t\t\t\t\t\tstartDate: minDate, \n\t\t\t\t\t\t\tendDate: maxDate,\n\t\t\t\t\t\t\tevents: _this.getEventsOnRange(minDate, new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate() + 1))\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\n\t\t\t/* Hover date */\n\t\t\tcells.mouseenter(function(e) {\n\t\t\t\tif(!_this._mouseDown)\n\t\t\t\t{\n\t\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t\t_this._triggerEvent('mouseOnDay', {\n\t\t\t\t\t\telement: $(this),\n\t\t\t\t\t\tdate: date,\n\t\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tcells.mouseleave(function(e) {\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('mouseOutDay', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Responsive management */\n\t\t\t\n\t\t\tsetInterval(function() {\n\t\t\t\tvar calendarSize = $(_this.element).width();\n\t\t\t\tvar monthSize = $(_this.element).find('.month').first().width() + 10;\n\t\t\t\tvar monthContainerClass = 'month-container';\n\t\t\t\t\n\t\t\t\tif(monthSize * 6 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-2';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 4 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-3';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 3 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-4';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 2 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-6';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmonthContainerClass += ' col-12';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$(_this.element).find('.month-container').attr('class', monthContainerClass);\n\t\t\t}, 300);\n\t\t},\n\t\t_refreshRange: function () {\n\t\t\tvar _this = this;\n\t\t\n this.element.find('td.day.range').removeClass('range')\n this.element.find('td.day.range-start').removeClass('range-start');\n this.element.find('td.day.range-end').removeClass('range-end');\n\n if (this._mouseDown) {\n var beforeRange = true;\n var afterRange = false;\n var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;\n var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;\n\n this.element.find('.month-container').each(function () {\n\t\t\t\t\tvar monthId = $(this).data('month-id');\n if (minDate.getMonth() <= monthId && maxDate.getMonth() >= monthId) {\n $(this).find('td.day:not(.old, .new)').each(function () {\n var date = _this._getDate($(this));\n if (date >= minDate && date <= maxDate) {\n $(this).addClass('range');\n\n if (date.getTime() == minDate.getTime()) {\n $(this).addClass('range-start');\n }\n\n if (date.getTime() == maxDate.getTime()) {\n $(this).addClass('range-end');\n }\n }\n });\n }\n });\n }\n },\n\t\t_openContextMenu: function(elt) {\n\t\t\tvar contextMenu = $('.calendar-context-menu');\n\t\t\t\n\t\t\tif(contextMenu.length > 0) {\n\t\t\t\tcontextMenu.hide();\n\t\t\t\tcontextMenu.empty();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontextMenu = $(document.createElement('div'));\n\t\t\t\tcontextMenu.addClass('calendar-context-menu');\n\t\t\t\t$('body').append(contextMenu);\n\t\t\t}\n\t\t\t\n\t\t\tvar date = this._getDate(elt);\n\t\t\tvar events = this.getEvents(date);\n\t\t\t\n\t\t\tfor(var i = 0; i < events.length; i++) {\n\t\t\t\tvar eventItem = $(document.createElement('div'));\n\t\t\t\teventItem.addClass('item');\n\t\t\t\teventItem.css('border-left', '4px solid ' + events[i].color);\n\t\t\t\t\n\t\t\t\tvar eventItemContent = $(document.createElement('div'));\n\t\t\t\teventItemContent.addClass('content');\n\t\t\t\teventItemContent.text(events[i].name);\n\t\t\t\t\n\t\t\t\teventItem.append(eventItemContent);\n\t\t\t\t\n\t\t\t\tvar icon = $(document.createElement('span'));\n\t\t\t\ticon.addClass('oi oi-chevron-right');\n\t\t\t\t\n\t\t\t\teventItem.append(icon);\n\t\t\t\t\n\t\t\t\tthis._renderContextMenuItems(eventItem, this.options.contextMenuItems, events[i]);\n\t\t\t\t\n\t\t\t\tcontextMenu.append(eventItem);\n\t\t\t}\n\t\t\t\n\t\t\tif(contextMenu.children().length > 0)\n\t\t\t{\n\t\t\t\tcontextMenu.css('left', elt.offset().left + 25 + 'px');\n\t\t\t\tcontextMenu.css('top', elt.offset().top + 25 + 'px');\n\t\t\t\tcontextMenu.show();\n\t\t\t\t\n\t\t\t\t$(window).one('mouseup', function() {\n\t\t\t\t\tcontextMenu.hide();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_renderContextMenuItems: function(parent, items, evt) {\n\t\t\tvar subMenu = $(document.createElement('div'));\n\t\t\tsubMenu.addClass('submenu');\n\t\t\t\n\t\t\tfor(var i = 0; i < items.length; i++) {\n\t\t\t\tif(!items[i].visible || items[i].visible(evt)) {\n\t\t\t\t\tvar menuItem = $(document.createElement('div'));\n\t\t\t\t\tmenuItem.addClass('item');\n\t\t\t\t\t\n\t\t\t\t\tvar menuItemContent = $(document.createElement('div'));\n\t\t\t\t\tmenuItemContent.addClass('content');\n\t\t\t\t\tmenuItemContent.text(items[i].text);\n\t\t\t\t\t\n\t\t\t\t\tmenuItem.append(menuItemContent);\n\t\t\t\t\t\n\t\t\t\t\tif(items[i].click) {\n\t\t\t\t\t\t(function(index) {\n\t\t\t\t\t\t\tmenuItem.click(function() {\n\t\t\t\t\t\t\t\titems[index].click(evt);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})(i);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar icon = $(document.createElement('span'));\n\t\t\t\t\ticon.addClass('oi oi-chevron-right');\n\t\t\t\t\t\n\t\t\t\t\tmenuItem.append(icon);\n\t\t\t\t\t\n\t\t\t\t\tif(items[i].items && items[i].items.length > 0) {\n\t\t\t\t\t\tthis._renderContextMenuItems(menuItem, items[i].items, evt);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tsubMenu.append(menuItem);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(subMenu.children().length > 0)\n\t\t\t{\n\t\t\t\tparent.append(subMenu);\n\t\t\t}\n\t\t},\n\t\t_getColor: function(colorString) {\n\t\t\tvar div = $('
');\n\t\t\tdiv.css('color', colorString);\n\t\t\t\n\t\t},\n\t\t_getDate: function(elt) {\n\t\t\tvar day = elt.children('.day-content').text();\n\t\t\tvar month = elt.closest('.month-container').data('month-id');\n\t\t\tvar year = this.options.startYear;\n\n\t\t\treturn new Date(year, month, day);\n\t\t},\n\t\t_triggerEvent: function(eventName, parameters) {\n\t\t\tvar event = $.Event(eventName);\n\t\t\t\n\t\t\tfor(var i in parameters) {\n\t\t\t\tevent[i] = parameters[i];\n\t\t\t}\n\t\t\t\n\t\t\tthis.element.trigger(event);\n\t\t\t\n\t\t\treturn event;\n\t\t},\n\t\t_isDisabled: function(date) {\n\t\t\tif((this.options.minDate != null && date < this.options.minDate) || (this.options.maxDate != null && date > this.options.maxDate))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.options.disabledWeekDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.disabledWeekDays.length; d++){\n\t\t\t\t\tif(date.getDay() == this.options.disabledWeekDays[d]) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(this.options.disabledDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.disabledDays.length; d++){\n\t\t\t\t\tif(date.getTime() == this.options.disabledDays[d].getTime()) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\t_isHidden: function(day) {\n\t\t\tif(this.options.hiddenWeekDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.hiddenWeekDays.length; d++) {\n\t\t\t\t\tif(day == this.options.hiddenWeekDays[d]) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\tgetWeekNumber: function(date) {\n\t\t\tvar tempDate = new Date(date.getTime());\n\t\t\ttempDate.setHours(0, 0, 0, 0);\n\t\t\ttempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7);\n\t\t\tvar week1 = new Date(tempDate.getFullYear(), 0, 4);\n\t\t\treturn 1 + Math.round(((tempDate.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);\n\t\t},\n\t\tgetEvents: function(date) {\n\t\t\treturn this.getEventsOnRange(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1));\n\t\t},\n\t\tgetEventsOnRange: function(startDate, endDate) {\n\t\t\tvar events = [];\n\t\t\t\n\t\t\tif(this.options.dataSource && startDate && endDate) {\n\t\t\t\tfor(var i = 0; i < this.options.dataSource.length; i++) {\n\t\t\t\t\tif(this.options.dataSource[i].startDate < endDate && this.options.dataSource[i].endDate >= startDate) {\n\t\t\t\t\t\tevents.push(this.options.dataSource[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn events;\n\t\t},\n\t\tgetYear: function() {\n\t\t\treturn this.options.startYear;\n\t\t},\n\t\tsetYear: function(year) {\n\t\t\tvar parsedYear = parseInt(year);\n\t\t\tif(!isNaN(parsedYear)) {\n\t\t\t\tthis.options.startYear = parsedYear;\n\t\t\t\t\t\t\t\t\n\t\t\t\tthis.element.empty();\n\t\t\t\n\t\t\t\tif(this.options.displayHeader) {\n\t\t\t\t\tthis._renderHeader();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar eventResult = this._triggerEvent('yearChanged', { currentYear: this.options.startYear, preventRendering: false });\n\t\t\t\t\n\t\t\t\tif(!eventResult.preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetMinDate: function() {\n\t\t\treturn this.options.minDate;\n\t\t},\n\t\tsetMinDate: function(date, preventRendering) {\n\t\t\tif(date instanceof Date) {\n\t\t\t\tthis.options.minDate = date;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetMaxDate: function() {\n\t\t\treturn this.options.maxDate;\n\t\t},\n\t\tsetMaxDate: function(date, preventRendering) {\n\t\t\tif(date instanceof Date) {\n\t\t\t\tthis.options.maxDate = date;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetStyle: function() {\n\t\t\treturn this.options.style;\n\t\t},\n\t\tsetStyle: function(style, preventRendering) {\n\t\t\tthis.options.style = style == 'background' || style == 'border' || style == 'custom' ? style : 'border';\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetAllowOverlap: function() {\n\t\t\treturn this.options.allowOverlap;\n\t\t},\n\t\tsetAllowOverlap: function(allowOverlap) {\n\t\t\tthis.options.allowOverlap = allowOverlap;\n\t\t},\n\t\tgetDisplayWeekNumber: function() {\n\t\t\treturn this.options.displayWeekNumber;\n\t\t},\n\t\tsetDisplayWeekNumber: function(displayWeekNumber, preventRendering) {\n\t\t\tthis.options.displayWeekNumber = displayWeekNumber;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisplayHeader: function() {\n\t\t\treturn this.options.displayHeader;\n\t\t},\n\t\tsetDisplayHeader: function(displayHeader, preventRendering) {\n\t\t\tthis.options.displayHeader = displayHeader;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisplayDisabledDataSource: function() {\n\t\t\treturn this.options.displayDisabledDataSource;\n\t\t},\n\t\tsetDisplayDisabledDataSource: function(displayDisabledDataSource, preventRendering) {\n\t\t\tthis.options.displayDisabledDataSource = displayDisabledDataSource;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetAlwaysHalfDay: function() {\n\t\t\treturn this.options.alwaysHalfDay;\n\t\t},\n\t\tsetAlwaysHalfDay: function(alwaysHalfDay, preventRendering) {\n\t\t\tthis.options.alwaysHalfDay = alwaysHalfDay;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetEnableRangeSelection: function() {\n\t\t\treturn this.options.enableRangeSelection;\n\t\t},\n\t\tsetEnableRangeSelection: function(enableRangeSelection, preventRendering) {\n\t\t\tthis.options.enableRangeSelection = enableRangeSelection;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisabledDays: function() {\n\t\t\treturn this.options.disabledDays;\n\t\t},\n\t\tsetDisabledDays: function(disabledDays, preventRendering) {\n\t\t\tthis.options.disabledDays = disabledDays instanceof Array ? disabledDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisabledWeekDays: function() {\n\t\t\treturn this.options.disabledWeekDays;\n\t\t},\n\t\tsetDisabledWeekDays: function(disabledWeekDays, preventRendering) {\n\t\t\tthis.options.disabledWeekDays = disabledWeekDays instanceof Array ? disabledWeekDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetHiddenWeekDays: function() {\n\t\t\treturn this.options.hiddenWeekDays;\n\t\t},\n\t\tsetHiddenWeekDays: function(hiddenWeekDays, preventRendering) {\n\t\t\tthis.options.hiddenWeekDays = hiddenWeekDays instanceof Array ? hiddenWeekDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetRoundRangeLimits: function() {\n\t\t\treturn this.options.roundRangeLimits;\n\t\t},\n\t\tsetRoundRangeLimits: function(roundRangeLimits, preventRendering) {\n\t\t\tthis.options.roundRangeLimits = roundRangeLimits;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetEnableContextMenu: function() {\n\t\t\treturn this.options.enableContextMenu;\n\t\t},\n\t\tsetEnableContextMenu: function(enableContextMenu, preventRendering) {\n\t\t\tthis.options.enableContextMenu = enableContextMenu;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetContextMenuItems: function() {\n\t\t\treturn this.options.contextMenuItems;\n\t\t},\n\t\tsetContextMenuItems: function(contextMenuItems, preventRendering) {\n\t\t\tthis.options.contextMenuItems = contextMenuItems instanceof Array ? contextMenuItems : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetCustomDayRenderer: function() {\n\t\t\treturn this.options.customDayRenderer;\n\t\t},\n\t\tsetCustomDayRenderer: function(customDayRenderer, preventRendering) {\n\t\t\tthis.options.customDayRenderer = $.isFunction(customDayRenderer) ? customDayRenderer : null;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetCustomDataSourceRenderer: function() {\n\t\t\treturn this.options.customDataSourceRenderer;\n\t\t},\n\t\tsetCustomDataSourceRenderer: function(customDataSourceRenderer, preventRendering) {\n\t\t\tthis.options.customDataSourceRenderer = $.isFunction(customDataSourceRenderer) ? customDataSourceRenderer : null;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetLanguage: function() {\n\t\t\treturn this.options.language;\n\t\t},\n\t\tsetLanguage: function(language, preventRendering) {\n\t\t\tif(language != null && dates[language] != null) {\n\t\t\t\tthis.options.language = language;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetDataSource: function() {\n\t\t\treturn this.options.dataSource;\n\t\t},\n\t\tsetDataSource: function(dataSource, preventRendering) {\n\t\t\tthis.options.dataSource = dataSource instanceof Array ? dataSource : [];\n\t\t\tthis._initializeDatasourceColors();\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetWeekStart: function() {\n\t\t\treturn this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;\n\t\t},\n\t\tsetWeekStart: function(weekStart, preventRendering) {\n\t\t\tthis.options.weekStart = !isNaN(parseInt(weekStart)) ? parseInt(weekStart) : null;\n\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\taddEvent: function(evt, preventRendering) {\n\t\t\tthis.options.dataSource.push(evt);\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t}\n\t}\n \n\t$.fn.calendar = function (options) {\n\t\tvar calendar = new Calendar($(this) ,options);\n\t\t$(this).data('calendar', calendar);\n\t\treturn calendar;\n\t}\n\t\n\t/* Events binding management */\n\t$.fn.yearChanged = function(fct) { $(this).bind('yearChanged', fct); }\n\t$.fn.renderEnd = function(fct) { $(this).bind('renderEnd', fct); }\n\t$.fn.clickDay = function(fct) { $(this).bind('clickDay', fct); }\n\t$.fn.dayContextMenu = function(fct) { $(this).bind('dayContextMenu', fct); }\n\t$.fn.selectRange = function(fct) { $(this).bind('selectRange', fct); }\n\t$.fn.mouseOnDay = function(fct) { $(this).bind('mouseOnDay', fct); }\n\t$.fn.mouseOutDay = function(fct) { $(this).bind('mouseOutDay', fct); }\n\t\n\tvar dates = $.fn.calendar.dates = {\n\t\ten: {\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tweekShort: 'W',\n\t\t\tweekStart:0\n\t\t}\n\t};\n\t\n\tvar colors = $.fn.calendar.colors = ['#2C8FC9', '#9CB703', '#F5BB00', '#FF4A32', '#B56CE2', '#45A597'];\n\t\n\t$(function(){\n\t\t$('[data-provide=\"calendar\"]').each(function() {\n\t\t\t$(this).calendar();\n\t\t});\n\t});\n }(window.jQuery));","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","export var name = \"d3\";\nexport var version = \"5.7.0\";\nexport var description = \"Data-Driven Documents\";\nexport var keywords = [\"dom\",\"visualization\",\"svg\",\"animation\",\"canvas\"];\nexport var homepage = \"https://d3js.org\";\nexport var license = \"BSD-3-Clause\";\nexport var author = {\"name\":\"Mike Bostock\",\"url\":\"https://bost.ocks.org/mike\"};\nexport var main = \"dist/d3.node.js\";\nexport var unpkg = \"dist/d3.min.js\";\nexport var jsdelivr = \"dist/d3.min.js\";\nexport var module = \"index.js\";\nexport var repository = {\"type\":\"git\",\"url\":\"https://github.com/d3/d3.git\"};\nexport var scripts = {\"pretest\":\"rimraf dist && mkdir dist && json2module package.json > dist/package.js && node rollup.node\",\"test\":\"tape 'test/**/*-test.js'\",\"prepublishOnly\":\"yarn test && rollup -c\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\"d3 ${npm_package_version}\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\"${npm_package_version}\\\" && git tag -am \\\"${npm_package_version}\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\nexport var devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"0.64\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"1\",\"tape\":\"4\"};\nexport var dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return x;\n}\n","export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","import {slice} from \"./array\";\nimport bisect from \"./bisect\";\nimport constant from \"./constant\";\nimport extent from \"./extent\";\nimport identity from \"./identity\";\nimport range from \"./range\";\nimport {tickStep} from \"./ticks\";\nimport sturges from \"./threshold/sturges\";\n\nexport default function() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n}\n","export default function(arrays) {\n var n = arrays.length,\n m,\n i = -1,\n j = 0,\n merged,\n array;\n\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n\n return merged;\n}\n","import transpose from \"./transpose\";\n\nexport default function() {\n return transpose(arguments);\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return x;\n}\n","import {slice} from \"./array\";\nimport identity from \"./identity\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n return function(d) {\n return +scale(d);\n };\n}\n\nfunction center(scale) {\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n if (scale.round()) offset = Math.round(offset);\n return function(d) {\n return +scale(d) + offset;\n };\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + 0.5,\n range1 = +range[range.length - 1] + 0.5,\n position = (scale.bandwidth ? center : number)(scale.copy()),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient == right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d)); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = slice.call(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n}\n","import namespace from \"./namespace\";\nimport {xhtml} from \"./namespaces\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","var matcher = function(selector) {\n return function() {\n return this.matches(selector);\n };\n};\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!element.matches) {\n var vendorMatches = element.webkitMatchesSelector\n || element.msMatchesSelector\n || element.mozMatchesSelector\n || element.oMatchesSelector;\n matcher = function(selector) {\n return function() {\n return vendorMatches.call(this, selector);\n };\n };\n }\n}\n\nexport default matcher;\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","import {Selection} from \"./index\";\nimport {EnterNode} from \"./enter\";\nimport constant from \"../constant\";\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = {},\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n if (keyValue in nodeByKeyValue) {\n exit[i] = node;\n } else {\n nodeByKeyValue[keyValue] = node;\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\n if (node = nodeByKeyValue[keyValue]) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue[keyValue] = null;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n exit[i] = node;\n }\n }\n}\n\nexport default function(value, key) {\n if (!value) {\n data = new Array(this.size()), j = -1;\n this.each(function(d) { data[++j] = d; });\n return data;\n }\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = value.call(parent, parent && parent.__data__, j, parents),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import namespace from \"../namespace\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator\";\nimport selector from \"../selector\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);\n}\n\nfunction selection_cloneDeep() {\n return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","var filterEvents = {};\n\nexport var event = null;\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!(\"onmouseenter\" in element)) {\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n }\n}\n\nfunction filterContextListener(listener, index, group) {\n listener = contextListener(listener, index, group);\n return function(event) {\n var related = event.relatedTarget;\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n listener.call(this, event);\n }\n };\n}\n\nfunction contextListener(listener, index, group) {\n return function(event1) {\n var event0 = event; // Events can be reentrant (e.g., focus).\n event = event1;\n try {\n listener.call(this, this.__data__, index, group);\n } finally {\n event = event0;\n }\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, capture) {\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n return function(d, i, group) {\n var on = this.__on, o, listener = wrap(value, i, group);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, capture);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, capture) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n if (capture == null) capture = false;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n return this;\n}\n\nexport function customEvent(event1, listener, that, args) {\n var event0 = event;\n event1.sourceEvent = event;\n event = event1;\n try {\n return listener.apply(that, args);\n } finally {\n event = event0;\n }\n}\n","import defaultView from \"../window\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select\";\nimport selection_selectAll from \"./selectAll\";\nimport selection_filter from \"./filter\";\nimport selection_data from \"./data\";\nimport selection_enter from \"./enter\";\nimport selection_exit from \"./exit\";\nimport selection_merge from \"./merge\";\nimport selection_order from \"./order\";\nimport selection_sort from \"./sort\";\nimport selection_call from \"./call\";\nimport selection_nodes from \"./nodes\";\nimport selection_node from \"./node\";\nimport selection_size from \"./size\";\nimport selection_empty from \"./empty\";\nimport selection_each from \"./each\";\nimport selection_attr from \"./attr\";\nimport selection_style from \"./style\";\nimport selection_property from \"./property\";\nimport selection_classed from \"./classed\";\nimport selection_text from \"./text\";\nimport selection_html from \"./html\";\nimport selection_raise from \"./raise\";\nimport selection_lower from \"./lower\";\nimport selection_append from \"./append\";\nimport selection_insert from \"./insert\";\nimport selection_remove from \"./remove\";\nimport selection_clone from \"./clone\";\nimport selection_datum from \"./datum\";\nimport selection_on from \"./on\";\nimport selection_dispatch from \"./dispatch\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n merge: selection_merge,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch\n};\n\nexport default selection;\n","import {Selection} from \"./index\";\nimport selector from \"../selector\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index\";\nimport selectorAll from \"../selectorAll\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index\";\nimport matcher from \"../matcher\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","import {Selection} from \"./index\";\n\nexport default function(selection) {\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n var nodes = new Array(this.size()), i = -1;\n this.each(function() { nodes[++i] = this; });\n return nodes;\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n var size = 0;\n this.each(function() { ++size; });\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","import creator from \"../creator\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n","import {dispatch} from \"d3-dispatch\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag\";\nimport noevent, {nopropagation} from \"./noevent\";\nimport constant from \"./constant\";\nimport DragEvent from \"./event\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return \"ontouchstart\" in this;\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), mouse, this, arguments);\n if (!gesture) return;\n select(event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n nodrag(event.view);\n nopropagation();\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\");\n }\n\n function mousemoved() {\n noevent();\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\");\n }\n\n function mouseupped() {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent();\n gestures.mouse(\"end\");\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = event.changedTouches,\n c = container.apply(this, arguments),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {\n nopropagation();\n gesture(\"start\");\n }\n }\n }\n\n function touchmoved() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent();\n gesture(\"drag\");\n }\n }\n }\n\n function touchended() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation();\n gesture(\"end\");\n }\n }\n }\n\n function beforestart(id, container, point, that, args) {\n var p = point(container, id), s, dx, dy,\n sublisteners = listeners.copy();\n\n if (!customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n if ((event.subject = s = subject.apply(that, args)) == null) return false;\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n return true;\n })) return;\n\n return function gesture(type) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[id] = gesture, n = active++; break;\n case \"end\": delete gestures[id], --active; // nobreak\n case \"drag\": p = point(container, id), n = active; break;\n }\n customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex3 = /^#([0-9a-f]{3})$/,\n reHex6 = /^#([0-9a-f]{6})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: function() {\n return this.rgb().hex();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nexport default function color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: function() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\n// https://beta.observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import constant from \"./constant\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis\";\nimport basisClosed from \"./basisClosed\";\nimport nogamma, {gamma} from \"./color\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n}\n","import {basis} from \"./basis\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import decompose, {identity} from \"./decompose\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb\";\nimport array from \"./array\";\nimport date from \"./date\";\nimport number from \"./number\";\nimport object from \"./object\";\nimport string from \"./string\";\nimport constant from \"./constant\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import number from \"../number\";\nimport {parseCss, parseSvg} from \"./parse\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(function(elapsed) {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTING) throw new Error(\"too late; already started\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n // Dispatch the interrupt event.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions. No interrupt event is dispatched\n // because the cancelled transitions never started. Note that this also\n // removes this transition from the pending list!\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(null, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n if (active) schedule.on.call(\"interrupt\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import {get, set} from \"./schedule\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {tweenValue} from \"./tween\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr\";\nimport transition_attrTween from \"./attrTween\";\nimport transition_delay from \"./delay\";\nimport transition_duration from \"./duration\";\nimport transition_ease from \"./ease\";\nimport transition_filter from \"./filter\";\nimport transition_merge from \"./merge\";\nimport transition_on from \"./on\";\nimport transition_remove from \"./remove\";\nimport transition_select from \"./select\";\nimport transition_selectAll from \"./selectAll\";\nimport transition_selection from \"./selection\";\nimport transition_style from \"./style\";\nimport transition_styleTween from \"./styleTween\";\nimport transition_text from \"./text\";\nimport transition_transition from \"./transition\";\nimport transition_tween from \"./tween\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {get, set, init} from \"./schedule\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttribute(name);\n value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + \"\"));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrTweenNS(fullname, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttributeNS(fullname.space, fullname.local, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttribute(name, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction styleRemove(name, interpolate) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction styleRemoveEnd(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = style(this, name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = value(this);\n if (value1 == null) value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleRemove(name, i))\n .on(\"end.style.\" + name, styleRemoveEnd(name))\n : this.styleTween(name, typeof value === \"function\"\n ? styleFunction(name, i, tweenValue(this, \"style.\" + name, value))\n : styleConstant(name, i, value + \"\"), priority);\n}\n","function styleTween(name, value, priority) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.style.setProperty(name, i(t), priority);\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {get, init} from \"./schedule\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n","var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n","var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return t * t * ((s + 1) * t - s);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((s + 1) * t + s) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n","var tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n","import {Transition, newId} from \"../transition/index\";\nimport schedule from \"../transition/schedule\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n return defaultTiming.time = now(), defaultTiming;\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt\";\nimport selection_transition from \"./transition\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {customEvent, event, mouse, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant\";\nimport BrushEvent from \"./event\";\nimport noevent, {nopropagation} from \"./noevent\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nvar X = {\n name: \"x\",\n handles: [\"e\", \"w\"].map(type),\n input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\"].map(type),\n input: function(xy) { return xy; },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n listeners = dispatch(brush, \"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\")\n .on(\"mousedown.brush touchstart.brush\", started);\n }\n\n brush.move = function(group, selection) {\n if (group.selection) {\n group\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && empty(selection1) ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 && selection1 ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 == null || empty(selection1) ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args) {\n return that.__brush.emitter || new Emitter(that, args);\n }\n\n function Emitter(that, args) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function() {\n if (this.starting) this.starting = false, this.emit(\"start\");\n return this;\n },\n brush: function() {\n this.emit(\"brush\");\n return this;\n },\n end: function() {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n return this;\n },\n emit: function(type) {\n customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function started() {\n if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent(); }\n else if (touchending) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx,\n dy,\n moving,\n shifting = signX && signY && event.shiftKey,\n lockX,\n lockY,\n point0 = mouse(that),\n point = point0,\n emit = emitter(that, arguments).beforestart();\n\n if (type === \"overlay\") {\n state.selection = selection = [\n [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n ];\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n group\n .on(\"touchmove.brush\", moved, true)\n .on(\"touchend.brush touchcancel.brush\", ended, true);\n } else {\n var view = select(event.view)\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n\n dragDisable(event.view);\n }\n\n nopropagation();\n interrupt(that);\n redraw.call(that);\n emit.start();\n\n function moved() {\n var point1 = mouse(that);\n if (shifting && !lockX && !lockY) {\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n else lockX = true;\n }\n point = point1;\n moving = true;\n noevent();\n move();\n }\n\n function move() {\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush();\n }\n }\n\n function ended() {\n nopropagation();\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n group.on(\"touchmove.brush touchend.brush touchcancel.brush\", null);\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end();\n }\n\n function keydowned() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n\n function keyupped() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = extent.apply(this, arguments);\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export var cos = Math.cos;\nexport var sin = Math.sin;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = pi * 2;\nexport var max = Math.max;\n","export var slice = Array.prototype.slice;\n","import {range} from \"d3-array\";\nimport {max, tau} from \"./math\";\n\nfunction compareValue(compare) {\n return function(a, b) {\n return compare(\n a.source.value + a.target.value,\n b.source.value + b.target.value\n );\n };\n}\n\nexport default function() {\n var padAngle = 0,\n sortGroups = null,\n sortSubgroups = null,\n sortChords = null;\n\n function chord(matrix) {\n var n = matrix.length,\n groupSums = [],\n groupIndex = range(n),\n subgroupIndex = [],\n chords = [],\n groups = chords.groups = new Array(n),\n subgroups = new Array(n * n),\n k,\n x,\n x0,\n dx,\n i,\n j;\n\n // Compute the sum.\n k = 0, i = -1; while (++i < n) {\n x = 0, j = -1; while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(range(n));\n k += x;\n }\n\n // Sort groups…\n if (sortGroups) groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n\n // Sort subgroups…\n if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n\n // Convert the sum to scaling factor for [0, 2pi].\n // TODO Allow start and end angle to be specified?\n // TODO Allow padding to be specified as percentage?\n k = max(0, tau - padAngle * n) / k;\n dx = k ? padAngle : tau / n;\n\n // Compute the start and end angle for each group and subgroup.\n // Note: Opera has a bug reordering object literal properties!\n x = 0, i = -1; while (++i < n) {\n x0 = x, j = -1; while (++j < n) {\n var di = groupIndex[i],\n dj = subgroupIndex[di][j],\n v = matrix[di][dj],\n a0 = x,\n a1 = x += v * k;\n subgroups[dj * n + di] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += dx;\n }\n\n // Generate chords for each (non-empty) subgroup-subgroup link.\n i = -1; while (++i < n) {\n j = i - 1; while (++j < n) {\n var source = subgroups[j * n + i],\n target = subgroups[i * n + j];\n if (source.value || target.value) {\n chords.push(source.value < target.value\n ? {source: target, target: source}\n : {source: source, target: target});\n }\n }\n }\n\n return sortChords ? chords.sort(sortChords) : chords;\n }\n\n chord.padAngle = function(_) {\n return arguments.length ? (padAngle = max(0, _), chord) : padAngle;\n };\n\n chord.sortGroups = function(_) {\n return arguments.length ? (sortGroups = _, chord) : sortGroups;\n };\n\n chord.sortSubgroups = function(_) {\n return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\n };\n\n chord.sortChords = function(_) {\n return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\n };\n\n return chord;\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport {cos, halfPi, sin} from \"./math\";\nimport {path} from \"d3-path\";\n\nfunction defaultSource(d) {\n return d.source;\n}\n\nfunction defaultTarget(d) {\n return d.target;\n}\n\nfunction defaultRadius(d) {\n return d.radius;\n}\n\nfunction defaultStartAngle(d) {\n return d.startAngle;\n}\n\nfunction defaultEndAngle(d) {\n return d.endAngle;\n}\n\nexport default function() {\n var source = defaultSource,\n target = defaultTarget,\n radius = defaultRadius,\n startAngle = defaultStartAngle,\n endAngle = defaultEndAngle,\n context = null;\n\n function ribbon() {\n var buffer,\n argv = slice.call(arguments),\n s = source.apply(this, argv),\n t = target.apply(this, argv),\n sr = +radius.apply(this, (argv[0] = s, argv)),\n sa0 = startAngle.apply(this, argv) - halfPi,\n sa1 = endAngle.apply(this, argv) - halfPi,\n sx0 = sr * cos(sa0),\n sy0 = sr * sin(sa0),\n tr = +radius.apply(this, (argv[0] = t, argv)),\n ta0 = startAngle.apply(this, argv) - halfPi,\n ta1 = endAngle.apply(this, argv) - halfPi;\n\n if (!context) context = buffer = path();\n\n context.moveTo(sx0, sy0);\n context.arc(0, 0, sr, sa0, sa1);\n if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\n context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\n context.arc(0, 0, tr, ta0, ta1);\n }\n context.quadraticCurveTo(0, 0, sx0, sy0);\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n ribbon.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), ribbon) : radius;\n };\n\n ribbon.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : startAngle;\n };\n\n ribbon.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : endAngle;\n };\n\n ribbon.source = function(_) {\n return arguments.length ? (source = _, ribbon) : source;\n };\n\n ribbon.target = function(_) {\n return arguments.length ? (target = _, ribbon) : target;\n };\n\n ribbon.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\n };\n\n return ribbon;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import map from \"./map\";\n\nexport default function() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map, depth) {\n if (++depth > keys.length) return map;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map.entries();\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n}\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map, key, value) {\n map.set(key, value);\n}\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","import {max, range, tickStep} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {blurX, blurY} from \"./blur\";\nimport constant from \"./constant\";\nimport contours from \"./contours\";\n\nfunction defaultX(d) {\n return d[0];\n}\n\nfunction defaultY(d) {\n return d[1];\n}\n\nfunction defaultWeight() {\n return 1;\n}\n\nexport default function() {\n var x = defaultX,\n y = defaultY,\n weight = defaultWeight,\n dx = 960,\n dy = 500,\n r = 20, // blur radius\n k = 2, // log2(grid cell size)\n o = r * 3, // grid offset, to pad for blur\n n = (dx + o * 2) >> k, // grid width\n m = (dy + o * 2) >> k, // grid height\n threshold = constant(20);\n\n function density(data) {\n var values0 = new Float32Array(n * m),\n values1 = new Float32Array(n * m);\n\n data.forEach(function(d, i, data) {\n var xi = (+x(d, i, data) + o) >> k,\n yi = (+y(d, i, data) + o) >> k,\n wi = +weight(d, i, data);\n if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\n values0[xi + yi * n] += wi;\n }\n });\n\n // TODO Optimize.\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n\n var tz = threshold(values0);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var stop = max(values0);\n tz = tickStep(0, stop, tz);\n tz = range(0, Math.floor(stop / tz) * tz, tz);\n tz.shift();\n }\n\n return contours()\n .thresholds(tz)\n .size([n, m])\n (values0)\n .map(transform);\n }\n\n function transform(geometry) {\n geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.\n geometry.coordinates.forEach(transformPolygon);\n return geometry;\n }\n\n function transformPolygon(coordinates) {\n coordinates.forEach(transformRing);\n }\n\n function transformRing(coordinates) {\n coordinates.forEach(transformPoint);\n }\n\n // TODO Optimize.\n function transformPoint(coordinates) {\n coordinates[0] = coordinates[0] * Math.pow(2, k) - o;\n coordinates[1] = coordinates[1] * Math.pow(2, k) - o;\n }\n\n function resize() {\n o = r * 3;\n n = (dx + o * 2) >> k;\n m = (dy + o * 2) >> k;\n return density;\n }\n\n density.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), density) : x;\n };\n\n density.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), density) : y;\n };\n\n density.weight = function(_) {\n return arguments.length ? (weight = typeof _ === \"function\" ? _ : constant(+_), density) : weight;\n };\n\n density.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 >= 0) && !(_0 >= 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, resize();\n };\n\n density.cellSize = function(_) {\n if (!arguments.length) return 1 << k;\n if (!((_ = +_) >= 1)) throw new Error(\"invalid cell size\");\n return k = Math.floor(Math.log(_) / Math.LN2), resize();\n };\n\n density.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold;\n };\n\n density.bandwidth = function(_) {\n if (!arguments.length) return Math.sqrt(r * (r + 1));\n if (!((_ = +_) >= 0)) throw new Error(\"invalid bandwidth\");\n return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();\n };\n\n return density;\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n })).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(text) {\n return text == null ? \"\"\n : reFormat.test(text += \"\") ? \"\\\"\" + text.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : text;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatRows: formatRows\n };\n}\n","import dsv from \"./dsv\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatRows = csv.formatRows;\n","import dsv from \"./dsv\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatRows = tsv.formatRows;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","import text from \"./text\";\n\nfunction parser(type) {\n return function(input, init) {\n return text(input, init).then(function(text) {\n return (new DOMParser).parseFromString(text, type);\n });\n };\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(d) {\n var x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, inherit the existing extent.\n if (x1 < x0) x0 = this._x0, x1 = this._x1;\n if (y1 < y0) y0 = this._y0, y1 = this._y1;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else if (x0 > x || x > x1 || y0 > y || y > y1) {\n var z = x1 - x0,\n node = this._root,\n parent,\n i;\n\n switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {\n case 0: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);\n break;\n }\n case 1: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);\n break;\n }\n case 2: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);\n break;\n }\n case 3: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);\n break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n // If the quadtree covers the point already, just return.\n else return this;\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add\";\nimport tree_cover from \"./cover\";\nimport tree_data from \"./data\";\nimport tree_extent from \"./extent\";\nimport tree_find from \"./find\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove\";\nimport tree_root from \"./root\";\nimport tree_size from \"./size\";\nimport tree_visit from \"./visit\";\nimport tree_visitAfter from \"./visitAfter\";\nimport tree_x, {defaultX} from \"./x\";\nimport tree_y, {defaultY} from \"./y\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","import Quad from \"./quad\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {map} from \"d3-collection\";\nimport {timer} from \"d3-timer\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\");\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick() {\n var i, n = nodes.length, node;\n\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.each(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n this.fill = match[1] || \" \";\n this.align = match[2] || \">\";\n this.sign = match[3] || \"-\";\n this.symbol = match[4] || \"\";\n this.zero = !!match[5];\n this.width = match[6] && +match[6];\n this.comma = !!match[7];\n this.precision = match[8] && +match[8].slice(1);\n this.trim = !!match[9];\n this.type = match[10] || \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto\";\nimport formatRounded from \"./formatRounded\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent\";\nimport formatGroup from \"./formatGroup\";\nimport formatNumerals from \"./formatNumerals\";\nimport formatSpecifier from \"./formatSpecifier\";\nimport formatTrim from \"./formatTrim\";\nimport formatTypes from \"./formatTypes\";\nimport {prefixExponent} from \"./formatPrefixAuto\";\nimport identity from \"./identity\";\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","import exponent from \"./exponent\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n return new Adder;\n}\n\nfunction Adder() {\n this.reset();\n}\n\nAdder.prototype = {\n constructor: Adder,\n reset: function() {\n this.s = // rounded value\n this.t = 0; // exact error\n },\n add: function(y) {\n add(temp, y, this.t);\n add(this, temp.s, this.s);\n if (this.s) this.t += temp.t;\n else this.s = temp.t;\n },\n valueOf: function() {\n return this.s;\n }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n var x = adder.s = a + b,\n bv = x - a,\n av = x - bv;\n adder.t = (a - av) + (b - bv);\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","import adder from \"./adder\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nexport var areaRingSum = adder();\n\nvar areaSum = adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum.reset();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli’s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum.reset();\n stream(object, areaStream);\n return areaSum * 2;\n}\n","import {asin, atan2, cos, sin, sqrt} from \"./math\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n","import adder from \"./adder\";\nimport {areaStream, areaRingSum} from \"./area\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport {abs, degrees, epsilon, radians} from \"./math\";\nimport stream from \"./stream\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum = adder(),\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum.reset();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n","import compose from \"./compose\";\nimport {asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math\";\n\nfunction rotationIdentity(lambda, phi) {\n return [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n","import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport constant from \"./constant\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math\";\nimport {rotateRadians} from \"./rotation\";\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(6),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n","import noop from \"../noop\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y) {\n line.push([x, y]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n","import {abs, epsilon} from \"./math\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import pointEqual from \"../pointEqual\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n // If the first and last points of a segment are coincident, then treat as a\n // closed ring. TODO if all rings are closed, then the winding order of the\n // exterior ring should be checked.\n if (pointEqual(p0, p1)) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n","import adder from \"./adder\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian\";\nimport {asin, atan2, cos, epsilon, halfPi, pi, quarterPi, sin, tau} from \"./math\";\n\nvar sum = adder();\n\nexport default function(polygon, point) {\n var lambda = point[0],\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n sum.reset();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = point0[0],\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = point1[0],\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point’s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1);\n}\n","import clipBuffer from \"./buffer\";\nimport clipRejoin from \"./rejoin\";\nimport {epsilon, halfPi} from \"../math\";\nimport polygonContains from \"../polygonContains\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n","import clip from \"./index\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n","import adder from \"./adder\";\nimport {abs, atan2, cos, radians, sin, sqrt} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nvar lengthSum = adder(),\n lambda0,\n sinPhi0,\n cosPhi0;\n\nvar lengthStream = {\n sphere: noop,\n point: noop,\n lineStart: lengthLineStart,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop\n};\n\nfunction lengthLineStart() {\n lengthStream.point = lengthPointFirst;\n lengthStream.lineEnd = lengthLineEnd;\n}\n\nfunction lengthLineEnd() {\n lengthStream.point = lengthStream.lineEnd = noop;\n}\n\nfunction lengthPointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);\n lengthStream.point = lengthPoint;\n}\n\nfunction lengthPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var sinPhi = sin(phi),\n cosPhi = cos(phi),\n delta = abs(lambda - lambda0),\n cosDelta = cos(delta),\n sinDelta = sin(delta),\n x = cosPhi * sinDelta,\n y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,\n z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;\n lengthSum.add(atan2(sqrt(x * x + y * y), z));\n lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;\n}\n\nexport default function(object) {\n lengthSum.reset();\n stream(object, lengthStream);\n return +lengthSum;\n}\n","import adder from \"../adder\";\nimport {abs} from \"../math\";\nimport noop from \"../noop\";\n\nvar areaSum = adder(),\n areaRingSum = adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum.reset();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum.reset();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","import adder from \"../adder\";\nimport {sqrt} from \"../math\";\nimport noop from \"../noop\";\n\nvar lengthSum = adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum.reset();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n this._string = [];\n}\n\nPathString.prototype = {\n _radius: 4.5,\n _circle: circle(4.5),\n pointRadius: function(_) {\n if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n return this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._string.push(\"Z\");\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._string.push(\"M\", x, \",\", y);\n this._point = 1;\n break;\n }\n case 1: {\n this._string.push(\"L\", x, \",\", y);\n break;\n }\n default: {\n if (this._circle == null) this._circle = circle(this._radius);\n this._string.push(\"M\", x, \",\", y, this._circle);\n break;\n }\n }\n },\n result: function() {\n if (this._string.length) {\n var result = this._string.join(\"\");\n this._string = [];\n return result;\n } else {\n return null;\n }\n }\n};\n\nfunction circle(radius) {\n return \"m0,\" + radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n + \"z\";\n}\n","export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {cartesian} from \"../cartesian\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math\";\nimport {transformer} from \"../transform\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n","import clipAntimeridian from \"../clip/antimeridian\";\nimport clipCircle from \"../clip/circle\";\nimport clipRectangle from \"../clip/rectangle\";\nimport compose from \"../compose\";\nimport identity from \"../identity\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math\";\nimport {rotateRadians} from \"../rotation\";\nimport {transformer} from \"../transform\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit\";\nimport resample from \"./resample\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy) {\n function transform(x, y) {\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k, (dy - y) / k];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, alpha) {\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [ai * x - bi * y + ci, fi - bi * x - ai * y];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),\n transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n","import {asin, atan2, cos, sin, sqrt} from \"../math\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n","import {asin, sqrt} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n return sqrt(2 / (1 + cxcy));\n});\n\nazimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n return 2 * asin(z / 2);\n});\n\nexport default function() {\n return projection(azimuthalEqualAreaRaw)\n .scale(124.75)\n .clipAngle(180 - 1e-3);\n}\n","import {acos, sin} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEquidistantRaw = azimuthalRaw(function(c) {\n return (c = acos(c)) && c / sin(c);\n});\n\nazimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n return z;\n});\n\nexport default function() {\n return projection(azimuthalEquidistantRaw)\n .scale(79.4188)\n .clipAngle(180 - 1e-3);\n}\n","import projection from \"./index\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n","import {abs, atan2, cos, epsilon, sign, sin, sqrt} from \"../math\";\nimport {conicProjection} from \"./conic\";\nimport {equirectangularRaw} from \"./equirectangular\";\n\nexport function conicEquidistantRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0),\n g = cy0 / n + y0;\n\n if (abs(n) < epsilon) return equirectangularRaw;\n\n function project(x, y) {\n var gy = g - y, nx = n * x;\n return [gy * sin(nx), g - gy * cos(nx)];\n }\n\n project.invert = function(x, y) {\n var gy = g - y;\n return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEquidistantRaw)\n .scale(131.154)\n .center([0, 13.9389]);\n}\n","import projection from \"./index.js\";\nimport {abs, asin, cos, epsilon2, sin, sqrt} from \"../math.js\";\n\nvar A1 = 1.340264,\n A2 = -0.081106,\n A3 = 0.000893,\n A4 = 0.003796,\n M = sqrt(3) / 2,\n iterations = 12;\n\nexport function equalEarthRaw(lambda, phi) {\n var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n return [\n lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n ];\n}\n\nequalEarthRaw.invert = function(x, y) {\n var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n if (abs(delta) < epsilon2) break;\n }\n return [\n M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l),\n asin(sin(l) / M)\n ];\n};\n\nexport default function() {\n return projection(equalEarthRaw)\n .scale(177.158);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function gnomonicRaw(x, y) {\n var cy = cos(y), k = cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\ngnomonicRaw.invert = azimuthalInvert(atan);\n\nexport default function() {\n return projection(gnomonicRaw)\n .scale(144.049)\n .clipAngle(60);\n}\n","import {asin, cos, epsilon, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function stereographicRaw(x, y) {\n var cy = cos(y), k = 1 + cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\nstereographicRaw.invert = azimuthalInvert(function(z) {\n return 2 * atan(z);\n});\n\nexport default function() {\n return projection(stereographicRaw)\n .scale(250)\n .clipAngle(142);\n}\n","function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n","import node_count from \"./count\";\nimport node_each from \"./each\";\nimport node_eachBefore from \"./eachBefore\";\nimport node_eachAfter from \"./eachAfter\";\nimport node_sum from \"./sum\";\nimport node_sort from \"./sort\";\nimport node_path from \"./path\";\nimport node_ancestors from \"./ancestors\";\nimport node_descendants from \"./descendants\";\nimport node_leaves from \"./leaves\";\nimport node_links from \"./links\";\n\nexport default function hierarchy(data, children) {\n var root = new Node(data),\n valued = +data.value && (root.value = data.value),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n if (children == null) children = defaultChildren;\n\n while (node = nodes.pop()) {\n if (valued) node.value = +node.data.value;\n if ((childs = children(node.data)) && (n = childs.length)) {\n node.children = new Array(n);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction defaultChildren(d) {\n return d.children;\n}\n\nfunction copyData(node) {\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy\n};\n","export default function(callback) {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n callback(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n } while (next.length);\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], next = [], children, i, n;\n while (node = nodes.pop()) {\n next.push(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n while (node = next.pop()) {\n callback(node);\n }\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], children, i;\n while (node = nodes.pop()) {\n callback(node), children = node.children;\n if (children) for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n return this;\n}\n","export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n","export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n","export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n","export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n","export default function() {\n var nodes = [];\n this.each(function(node) {\n nodes.push(node);\n });\n return nodes;\n}\n","export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n","export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don’t include the root’s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n","export var slice = Array.prototype.slice;\n\nexport function shuffle(array) {\n var m = array.length,\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m];\n array[m] = array[i];\n array[i] = t;\n }\n\n return array;\n}\n","export default function(node) {\n node.x0 = Math.round(node.x0);\n node.y0 = Math.round(node.y0);\n node.x1 = Math.round(node.x1);\n node.y1 = Math.round(node.y1);\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (x1 - x0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.y0 = y0, node.y1 = y1;\n node.x0 = x0, node.x1 = x0 += node.value * k;\n }\n}\n","import {Node} from \"./hierarchy/index\";\n\nfunction defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\n// function radialSeparation(a, b) {\n// return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n var children = v.children;\n return children ? children[0] : v.t;\n}\n\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n var children = v.children;\n return children ? children[children.length - 1] : v.t;\n}\n\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n}\n\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n var shift = 0,\n change = 0,\n children = v.children,\n i = children.length,\n w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n}\n\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n}\n\nfunction TreeNode(node, i) {\n this._ = node;\n this.parent = null;\n this.children = null;\n this.A = null; // default ancestor\n this.a = this; // ancestor\n this.z = 0; // prelim\n this.m = 0; // mod\n this.c = 0; // change\n this.s = 0; // shift\n this.t = null; // thread\n this.i = i; // number\n}\n\nTreeNode.prototype = Object.create(Node.prototype);\n\nfunction treeRoot(root) {\n var tree = new TreeNode(root, 0),\n node,\n nodes = [tree],\n child,\n children,\n i,\n n;\n\n while (node = nodes.pop()) {\n if (children = node._.children) {\n node.children = new Array(n = children.length);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n child.parent = node;\n }\n }\n }\n\n (tree.parent = new TreeNode(null, 0)).children = [tree];\n return tree;\n}\n\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = null;\n\n function tree(root) {\n var t = treeRoot(root);\n\n // Compute the layout using Buchheim et al.’s algorithm.\n t.eachAfter(firstWalk), t.parent.m = -t.z;\n t.eachBefore(secondWalk);\n\n // If a fixed node size is specified, scale x and y.\n if (nodeSize) root.eachBefore(sizeNode);\n\n // If a fixed tree size is specified, scale x and y based on the extent.\n // Compute the left-most, right-most, and depth-most nodes for extents.\n else {\n var left = root,\n right = root,\n bottom = root;\n root.eachBefore(function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var s = left === right ? 1 : separation(left, right) / 2,\n tx = s - left.x,\n kx = dx / (right.x + s + tx),\n ky = dy / (bottom.depth || 1);\n root.eachBefore(function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n\n return root;\n }\n\n // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n // applied recursively to the children of v, as well as the function\n // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n // node v is placed to the midpoint of its outermost children.\n function firstWalk(v) {\n var children = v.children,\n siblings = v.parent.children,\n w = v.i ? siblings[v.i - 1] : null;\n if (children) {\n executeShifts(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n\n // Computes all real x-coordinates by summing up the modifiers recursively.\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n\n // The core of the algorithm. Here, a new subtree is combined with the\n // previous subtrees. Threads are used to traverse the inside and outside\n // contours of the left and right subtree up to the highest common level. The\n // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n // superscript o means outside and i means inside, the subscript - means left\n // subtree and + means right subtree. For summing up the modifiers along the\n // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n // nodes of the inside contours conflict, we compute the left one of the\n // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n // Finally, we add a new thread (if necessary).\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v,\n vop = v,\n vim = w,\n vom = vip.parent.children[0],\n sip = vip.m,\n sop = vop.m,\n sim = vim.m,\n som = vom.m,\n shift;\n while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n vom = nextLeft(vom);\n vop = nextRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !nextRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !nextLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n\n function sizeNode(node) {\n node.x *= dx;\n node.y = node.depth * dy;\n }\n\n tree.separation = function(x) {\n return arguments.length ? (separation = x, tree) : separation;\n };\n\n tree.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);\n };\n\n tree.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);\n };\n\n return tree;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (y1 - y0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.x0 = x0, node.x1 = x1;\n node.y0 = y0, node.y1 = y0 += node.value * k;\n }\n}\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\n\nexport var phi = (1 + Math.sqrt(5)) / 2;\n\nexport function squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n var rows = [],\n nodes = parent.children,\n row,\n nodeValue,\n i0 = 0,\n i1 = 0,\n n = nodes.length,\n dx, dy,\n value = parent.value,\n sumValue,\n minValue,\n maxValue,\n newRatio,\n minRatio,\n alpha,\n beta;\n\n while (i0 < n) {\n dx = x1 - x0, dy = y1 - y0;\n\n // Find the next non-empty node.\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n minValue = maxValue = sumValue;\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n beta = sumValue * sumValue * alpha;\n minRatio = Math.max(maxValue / beta, beta / minValue);\n\n // Keep adding nodes while the aspect ratio maintains or improves.\n for (; i1 < n; ++i1) {\n sumValue += nodeValue = nodes[i1].value;\n if (nodeValue < minValue) minValue = nodeValue;\n if (nodeValue > maxValue) maxValue = nodeValue;\n beta = sumValue * sumValue * alpha;\n newRatio = Math.max(maxValue / beta, beta / minValue);\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\n minRatio = newRatio;\n }\n\n // Position and record the row orientation.\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\n if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n value -= sumValue, i0 = i1;\n }\n\n return rows;\n}\n\nexport default (function custom(ratio) {\n\n function squarify(parent, x0, y0, x1, y1) {\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\n }\n\n squarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return squarify;\n})(phi);\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\nimport {phi, squarifyRatio} from \"./squarify\";\n\nexport default (function custom(ratio) {\n\n function resquarify(parent, x0, y0, x1, y1) {\n if ((rows = parent._squarify) && (rows.ratio === ratio)) {\n var rows,\n row,\n nodes,\n i,\n j = -1,\n n,\n m = rows.length,\n value = parent.value;\n\n while (++j < m) {\n row = rows[j], nodes = row.children;\n for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);\n else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\n value -= row.value;\n }\n } else {\n parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);\n rows.ratio = ratio;\n }\n }\n\n resquarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return resquarify;\n})(phi);\n","import cross from \"./cross\";\n\nfunction lexicographicOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n}\n\n// Computes the upper convex hull per the monotone chain algorithm.\n// Assumes points.length >= 3, is sorted by x, unique in y.\n// Returns an array of indices into points in left-to-right order.\nfunction computeUpperHullIndexes(points) {\n var n = points.length,\n indexes = [0, 1],\n size = 2;\n\n for (var i = 2; i < n; ++i) {\n while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;\n indexes[size++] = i;\n }\n\n return indexes.slice(0, size); // remove popped points\n}\n\nexport default function(points) {\n if ((n = points.length) < 3) return null;\n\n var i,\n n,\n sortedPoints = new Array(n),\n flippedPoints = new Array(n);\n\n for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];\n sortedPoints.sort(lexicographicOrder);\n for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];\n\n var upperIndexes = computeUpperHullIndexes(sortedPoints),\n lowerIndexes = computeUpperHullIndexes(flippedPoints);\n\n // Construct the hull polygon, removing possible duplicate endpoints.\n var skipLeft = lowerIndexes[0] === upperIndexes[0],\n skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],\n hull = [];\n\n // Add upper hull in right-to-l order.\n // Then add lower hull in left-to-right order.\n for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);\n for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);\n\n return hull;\n}\n","export default function() {\n return Math.random();\n}\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomNormal(source) {\n function randomNormal(mu, sigma) {\n var x, r;\n mu = mu == null ? 0 : +mu;\n sigma = sigma == null ? 1 : +sigma;\n return function() {\n var y;\n\n // If available, use the second previously-generated uniform random.\n if (x != null) y = x, x = null;\n\n // Otherwise, generate a new x and y.\n else do {\n x = source() * 2 - 1;\n y = source() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n\n return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n };\n }\n\n randomNormal.source = sourceRandomNormal;\n\n return randomNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomUniform(source) {\n function randomUniform(min, max) {\n min = min == null ? 0 : +min;\n max = max == null ? 1 : +max;\n if (arguments.length === 1) max = min, min = 0;\n else max -= min;\n return function() {\n return source() * max + min;\n };\n }\n\n randomUniform.source = sourceRandomUniform;\n\n return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomIrwinHall(source) {\n function randomIrwinHall(n) {\n return function() {\n for (var sum = 0, i = 0; i < n; ++i) sum += source();\n return sum;\n };\n }\n\n randomIrwinHall.source = sourceRandomIrwinHall;\n\n return randomIrwinHall;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport normal from \"./normal\";\n\nexport default (function sourceRandomLogNormal(source) {\n function randomLogNormal() {\n var randomNormal = normal.source(source).apply(this, arguments);\n return function() {\n return Math.exp(randomNormal());\n };\n }\n\n randomLogNormal.source = sourceRandomLogNormal;\n\n return randomLogNormal;\n})(defaultSource);\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import defaultSource from \"./defaultSource\";\nimport irwinHall from \"./irwinHall\";\n\nexport default (function sourceRandomBates(source) {\n function randomBates(n) {\n var randomIrwinHall = irwinHall.source(source)(n);\n return function() {\n return randomIrwinHall() / n;\n };\n }\n\n randomBates.source = sourceRandomBates;\n\n return randomBates;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomExponential(source) {\n function randomExponential(lambda) {\n return function() {\n return -Math.log(1 - source()) / lambda;\n };\n }\n\n randomExponential.source = sourceRandomExponential;\n\n return randomExponential;\n})(defaultSource);\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal(range) {\n var index = map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : slice.call(range);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nexport default function continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(deinterpolate, reinterpolate);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n return linearish(scale);\n}\n","export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n","import interval from \"./interval\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval\";\nimport {durationSecond} from \"./duration\";\n\nvar second = interval(function(date) {\n date.setTime(Math.floor(date / durationSecond) * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar minute = interval(function(date) {\n date.setTime(Math.floor(date / durationMinute) * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval\";\nimport {durationHour, durationMinute} from \"./duration\";\n\nvar hour = interval(function(date) {\n var offset = date.getTimezoneOffset() * durationMinute % durationHour;\n if (offset < 0) offset += durationHour;\n date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval\";\nimport {durationDay, durationMinute} from \"./duration\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval\";\nimport {durationMinute, durationWeek} from \"./duration\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","import interval from \"./interval\";\nimport {durationHour} from \"./duration\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval\";\nimport {durationDay} from \"./duration\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval\";\nimport {durationWeek} from \"./duration\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newYear(d.y)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = newDate(newYear(d.y)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat\";\nimport {utcParse} from \"./defaultLocale\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import {bisector, tickStep} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n durationMinute = durationSecond * 60,\n durationHour = durationMinute * 60,\n durationDay = durationHour * 24,\n durationWeek = durationDay * 7,\n durationMonth = durationDay * 30,\n durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(deinterpolate, reinterpolate),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\nexport default function() {\n return calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default function(scheme) {\n return interpolateRgbBasis(scheme[scheme.length - 1]);\n}\n","import colors from \"../colors\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"d8b365f5f5f55ab4ac\",\n \"a6611adfc27d80cdc1018571\",\n \"a6611adfc27df5f5f580cdc1018571\",\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"af8dc3f7f7f77fbf7b\",\n \"7b3294c2a5cfa6dba0008837\",\n \"7b3294c2a5cff7f7f7a6dba0008837\",\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e9a3c9f7f7f7a1d76a\",\n \"d01c8bf1b6dab8e1864dac26\",\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"998ec3f7f7f7f1a340\",\n \"5e3c99b2abd2fdb863e66101\",\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\n \"542788998ec3d8daebfee0b6f1a340b35806\",\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62f7f7f767a9cf\",\n \"ca0020f4a58292c5de0571b0\",\n \"ca0020f4a582f7f7f792c5de0571b0\",\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62ffffff999999\",\n \"ca0020f4a582bababa404040\",\n \"ca0020f4a582ffffffbababa404040\",\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91bfdb\",\n \"d7191cfdae61abd9e92c7bb6\",\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91cf60\",\n \"d7191cfdae61a6d96a1a9641\",\n \"d7191cfdae61ffffbfa6d96a1a9641\",\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf99d594\",\n \"d7191cfdae61abdda42b83ba\",\n \"d7191cfdae61ffffbfabdda42b83ba\",\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5f999d8c92ca25f\",\n \"edf8fbb2e2e266c2a4238b45\",\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0ecf49ebcda8856a7\",\n \"edf8fbb3cde38c96c688419d\",\n \"edf8fbb3cde38c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0f3dba8ddb543a2ca\",\n \"f0f9e8bae4bc7bccc42b8cbe\",\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee8c8fdbb84e34a33\",\n \"fef0d9fdcc8afc8d59d7301f\",\n \"fef0d9fdcc8afc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece2f0a6bddb1c9099\",\n \"f6eff7bdc9e167a9cf02818a\",\n \"f6eff7bdc9e167a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece7f2a6bddb2b8cbe\",\n \"f1eef6bdc9e174a9cf0570b0\",\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e7e1efc994c7dd1c77\",\n \"f1eef6d7b5d8df65b0ce1256\",\n \"f1eef6d7b5d8df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fde0ddfa9fb5c51b8a\",\n \"feebe2fbb4b9f768a1ae017e\",\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"edf8b17fcdbb2c7fb8\",\n \"ffffcca1dab441b6c4225ea8\",\n \"ffffcca1dab441b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f7fcb9addd8e31a354\",\n \"ffffccc2e69978c679238443\",\n \"ffffccc2e69978c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fff7bcfec44fd95f0e\",\n \"ffffd4fed98efe9929cc4c02\",\n \"ffffd4fed98efe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ffeda0feb24cf03b20\",\n \"ffffb2fecc5cfd8d3ce31a1c\",\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"deebf79ecae13182bd\",\n \"eff3ffbdd7e76baed62171b5\",\n \"eff3ffbdd7e76baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5e0a1d99b31a354\",\n \"edf8e9bae4b374c476238b45\",\n \"edf8e9bae4b374c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f0f0f0bdbdbd636363\",\n \"f7f7f7cccccc969696525252\",\n \"f7f7f7cccccc969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"efedf5bcbddc756bb1\",\n \"f2f0f7cbc9e29e9ac86a51a3\",\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee0d2fc9272de2d26\",\n \"fee5d9fcae91fb6a4acb181d\",\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee6cefdae6be6550d\",\n \"feeddefdbe85fd8d3cd94701\",\n \"feeddefdbe85fd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n c.h = 360 * t - 100;\n c.s = 1.5 - 1.5 * ts;\n c.l = 0.8 - 0.9 * ts;\n return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n pi_1_3 = Math.PI / 3,\n pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n var x;\n t = (0.5 - t) * Math.PI;\n c.r = 255 * (x = Math.sin(t)) * x;\n c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n return c + \"\";\n}\n","import colors from \"../colors\";\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial\";\nimport line from \"./line\";\n\nexport function lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nexport default function() {\n return lineRadial(line().curve(curveRadialLinear));\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport offsetNone from \"./offset/none\";\nimport orderNone from \"./order/none\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","function RedBlackTree() {\n this._ = null; // root node\n}\n\nexport function RedBlackNode(node) {\n node.U = // parent node\n node.C = // color - true for red, false for black\n node.L = // left node\n node.R = // right node\n node.P = // previous node\n node.N = null; // next node\n}\n\nRedBlackTree.prototype = {\n constructor: RedBlackTree,\n\n insert: function(after, node) {\n var parent, grandpa, uncle;\n\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = RedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n RedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n RedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n\n var parent = node.U,\n sibling,\n left = node.L,\n right = node.R,\n next,\n red;\n\n if (!left) next = right;\n else if (!right) next = left;\n else next = RedBlackFirst(right);\n\n if (parent) {\n if (parent.L === node) parent.L = next;\n else parent.R = next;\n } else {\n this._ = next;\n }\n\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) { node.C = false; return; }\n\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n RedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n RedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n RedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n RedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n\n if (node) node.C = false;\n }\n};\n\nfunction RedBlackRotateLeft(tree, node) {\n var p = node,\n q = node.R,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n}\n\nfunction RedBlackRotateRight(tree, node) {\n var p = node,\n q = node.L,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n}\n\nfunction RedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n}\n\nexport default RedBlackTree;\n","import {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createEdge(left, right, v0, v1) {\n var edge = [null, null],\n index = edges.push(edge) - 1;\n edge.left = left;\n edge.right = right;\n if (v0) setEdgeEnd(edge, left, right, v0);\n if (v1) setEdgeEnd(edge, right, left, v1);\n cells[left.index].halfedges.push(index);\n cells[right.index].halfedges.push(index);\n return edge;\n}\n\nexport function createBorderEdge(left, v0, v1) {\n var edge = [v0, v1];\n edge.left = left;\n return edge;\n}\n\nexport function setEdgeEnd(edge, left, right, vertex) {\n if (!edge[0] && !edge[1]) {\n edge[0] = vertex;\n edge.left = left;\n edge.right = right;\n } else if (edge.left === right) {\n edge[1] = vertex;\n } else {\n edge[0] = vertex;\n }\n}\n\n// Liang–Barsky line clipping.\nfunction clipEdge(edge, x0, y0, x1, y1) {\n var a = edge[0],\n b = edge[1],\n ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\n\n if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\n if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\n return true;\n}\n\nfunction connectEdge(edge, x0, y0, x1, y1) {\n var v1 = edge[1];\n if (v1) return true;\n\n var v0 = edge[0],\n left = edge.left,\n right = edge.right,\n lx = left[0],\n ly = left[1],\n rx = right[0],\n ry = right[1],\n fx = (lx + rx) / 2,\n fy = (ly + ry) / 2,\n fm,\n fb;\n\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!v0) v0 = [fx, y0];\n else if (v0[1] >= y1) return;\n v1 = [fx, y1];\n } else {\n if (!v0) v0 = [fx, y1];\n else if (v0[1] < y0) return;\n v1 = [fx, y0];\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!v0) v0 = [(y0 - fb) / fm, y0];\n else if (v0[1] >= y1) return;\n v1 = [(y1 - fb) / fm, y1];\n } else {\n if (!v0) v0 = [(y1 - fb) / fm, y1];\n else if (v0[1] < y0) return;\n v1 = [(y0 - fb) / fm, y0];\n }\n } else {\n if (ly < ry) {\n if (!v0) v0 = [x0, fm * x0 + fb];\n else if (v0[0] >= x1) return;\n v1 = [x1, fm * x1 + fb];\n } else {\n if (!v0) v0 = [x1, fm * x1 + fb];\n else if (v0[0] < x0) return;\n v1 = [x0, fm * x0 + fb];\n }\n }\n }\n\n edge[0] = v0;\n edge[1] = v1;\n return true;\n}\n\nexport function clipEdges(x0, y0, x1, y1) {\n var i = edges.length,\n edge;\n\n while (i--) {\n if (!connectEdge(edge = edges[i], x0, y0, x1, y1)\n || !clipEdge(edge, x0, y0, x1, y1)\n || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon\n || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {\n delete edges[i];\n }\n }\n}\n","import {createBorderEdge} from \"./Edge\";\nimport {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createCell(site) {\n return cells[site.index] = {\n site: site,\n halfedges: []\n };\n}\n\nfunction cellHalfedgeAngle(cell, edge) {\n var site = cell.site,\n va = edge.left,\n vb = edge.right;\n if (site === vb) vb = va, va = site;\n if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\n if (site === va) va = edge[1], vb = edge[0];\n else va = edge[0], vb = edge[1];\n return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\n}\n\nexport function cellHalfedgeStart(cell, edge) {\n return edge[+(edge.left !== cell.site)];\n}\n\nexport function cellHalfedgeEnd(cell, edge) {\n return edge[+(edge.left === cell.site)];\n}\n\nexport function sortCellHalfedges() {\n for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\n if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\n var index = new Array(m),\n array = new Array(m);\n for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);\n index.sort(function(i, j) { return array[j] - array[i]; });\n for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\n for (j = 0; j < m; ++j) halfedges[j] = array[j];\n }\n }\n}\n\nexport function clipCells(x0, y0, x1, y1) {\n var nCells = cells.length,\n iCell,\n cell,\n site,\n iHalfedge,\n halfedges,\n nHalfedges,\n start,\n startX,\n startY,\n end,\n endX,\n endY,\n cover = true;\n\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n halfedges = cell.halfedges;\n iHalfedge = halfedges.length;\n\n // Remove any dangling clipped edges.\n while (iHalfedge--) {\n if (!edges[halfedges[iHalfedge]]) {\n halfedges.splice(iHalfedge, 1);\n }\n }\n\n // Insert any border edges as necessary.\n iHalfedge = 0, nHalfedges = halfedges.length;\n while (iHalfedge < nHalfedges) {\n end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\n start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\n if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {\n halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,\n Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]\n : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]\n : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]\n : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]\n : null)) - 1);\n ++nHalfedges;\n }\n }\n\n if (nHalfedges) cover = false;\n }\n }\n\n // If there weren’t any edges, have the closest site cover the extent.\n // It doesn’t matter which corner of the extent we measure!\n if (cover) {\n var dx, dy, d2, dc = Infinity;\n\n for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n dx = site[0] - x0;\n dy = site[1] - y0;\n d2 = dx * dx + dy * dy;\n if (d2 < dc) dc = d2, cover = cell;\n }\n }\n\n if (cover) {\n var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\n cover.halfedges.push(\n edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\n edges.push(createBorderEdge(site, v01, v11)) - 1,\n edges.push(createBorderEdge(site, v11, v10)) - 1,\n edges.push(createBorderEdge(site, v10, v00)) - 1\n );\n }\n }\n\n // Lastly delete any cells with no edges; these were entirely clipped.\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n if (!cell.halfedges.length) {\n delete cells[iCell];\n }\n }\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {circles, epsilon2} from \"./Diagram\";\n\nvar circlePool = [];\n\nexport var firstCircle;\n\nfunction Circle() {\n RedBlackNode(this);\n this.x =\n this.y =\n this.arc =\n this.site =\n this.cy = null;\n}\n\nexport function attachCircle(arc) {\n var lArc = arc.P,\n rArc = arc.N;\n\n if (!lArc || !rArc) return;\n\n var lSite = lArc.site,\n cSite = arc.site,\n rSite = rArc.site;\n\n if (lSite === rSite) return;\n\n var bx = cSite[0],\n by = cSite[1],\n ax = lSite[0] - bx,\n ay = lSite[1] - by,\n cx = rSite[0] - bx,\n cy = rSite[1] - by;\n\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -epsilon2) return;\n\n var ha = ax * ax + ay * ay,\n hc = cx * cx + cy * cy,\n x = (cy * ha - ay * hc) / d,\n y = (ax * hc - cx * ha) / d;\n\n var circle = circlePool.pop() || new Circle;\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\n\n arc.circle = circle;\n\n var before = null,\n node = circles._;\n\n while (node) {\n if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\n if (node.L) node = node.L;\n else { before = node.P; break; }\n } else {\n if (node.R) node = node.R;\n else { before = node; break; }\n }\n }\n\n circles.insert(before, circle);\n if (!before) firstCircle = circle;\n}\n\nexport function detachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) firstCircle = circle.N;\n circles.remove(circle);\n circlePool.push(circle);\n RedBlackNode(circle);\n arc.circle = null;\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {createCell} from \"./Cell\";\nimport {attachCircle, detachCircle} from \"./Circle\";\nimport {createEdge, setEdgeEnd} from \"./Edge\";\nimport {beaches, epsilon} from \"./Diagram\";\n\nvar beachPool = [];\n\nfunction Beach() {\n RedBlackNode(this);\n this.edge =\n this.site =\n this.circle = null;\n}\n\nfunction createBeach(site) {\n var beach = beachPool.pop() || new Beach;\n beach.site = site;\n return beach;\n}\n\nfunction detachBeach(beach) {\n detachCircle(beach);\n beaches.remove(beach);\n beachPool.push(beach);\n RedBlackNode(beach);\n}\n\nexport function removeBeach(beach) {\n var circle = beach.circle,\n x = circle.x,\n y = circle.cy,\n vertex = [x, y],\n previous = beach.P,\n next = beach.N,\n disappearing = [beach];\n\n detachBeach(beach);\n\n var lArc = previous;\n while (lArc.circle\n && Math.abs(x - lArc.circle.x) < epsilon\n && Math.abs(y - lArc.circle.cy) < epsilon) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n detachBeach(lArc);\n lArc = previous;\n }\n\n disappearing.unshift(lArc);\n detachCircle(lArc);\n\n var rArc = next;\n while (rArc.circle\n && Math.abs(x - rArc.circle.x) < epsilon\n && Math.abs(y - rArc.circle.cy) < epsilon) {\n next = rArc.N;\n disappearing.push(rArc);\n detachBeach(rArc);\n rArc = next;\n }\n\n disappearing.push(rArc);\n detachCircle(rArc);\n\n var nArcs = disappearing.length,\n iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\n\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nexport function addBeach(site) {\n var x = site[0],\n directrix = site[1],\n lArc,\n rArc,\n dxl,\n dxr,\n node = beaches._;\n\n while (node) {\n dxl = leftBreakPoint(node, directrix) - x;\n if (dxl > epsilon) node = node.L; else {\n dxr = x - rightBreakPoint(node, directrix);\n if (dxr > epsilon) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -epsilon) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -epsilon) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n\n createCell(site);\n var newArc = createBeach(site);\n beaches.insert(lArc, newArc);\n\n if (!lArc && !rArc) return;\n\n if (lArc === rArc) {\n detachCircle(lArc);\n rArc = createBeach(lArc.site);\n beaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\n attachCircle(lArc);\n attachCircle(rArc);\n return;\n }\n\n if (!rArc) { // && lArc\n newArc.edge = createEdge(lArc.site, newArc.site);\n return;\n }\n\n // else lArc !== rArc\n detachCircle(lArc);\n detachCircle(rArc);\n\n var lSite = lArc.site,\n ax = lSite[0],\n ay = lSite[1],\n bx = site[0] - ax,\n by = site[1] - ay,\n rSite = rArc.site,\n cx = rSite[0] - ax,\n cy = rSite[1] - ay,\n d = 2 * (bx * cy - by * cx),\n hb = bx * bx + by * by,\n hc = cx * cx + cy * cy,\n vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\n\n setEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = createEdge(lSite, site, null, vertex);\n rArc.edge = createEdge(site, rSite, null, vertex);\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nfunction leftBreakPoint(arc, directrix) {\n var site = arc.site,\n rfocx = site[0],\n rfocy = site[1],\n pby2 = rfocy - directrix;\n\n if (!pby2) return rfocx;\n\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n\n site = lArc.site;\n var lfocx = site[0],\n lfocy = site[1],\n plby2 = lfocy - directrix;\n\n if (!plby2) return lfocx;\n\n var hl = lfocx - rfocx,\n aby2 = 1 / pby2 - 1 / plby2,\n b = hl / plby2;\n\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n\n return (rfocx + lfocx) / 2;\n}\n\nfunction rightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return leftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site[1] === directrix ? site[0] : Infinity;\n}\n","import {addBeach, removeBeach} from \"./Beach\";\nimport {sortCellHalfedges, cellHalfedgeStart, clipCells} from \"./Cell\";\nimport {firstCircle} from \"./Circle\";\nimport {clipEdges} from \"./Edge\";\nimport RedBlackTree from \"./RedBlackTree\";\n\nexport var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var beaches;\nexport var cells;\nexport var circles;\nexport var edges;\n\nfunction triangleArea(a, b, c) {\n return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\n}\n\nfunction lexicographic(a, b) {\n return b[1] - a[1]\n || b[0] - a[0];\n}\n\nexport default function Diagram(sites, extent) {\n var site = sites.sort(lexicographic).pop(),\n x,\n y,\n circle;\n\n edges = [];\n cells = new Array(sites.length);\n beaches = new RedBlackTree;\n circles = new RedBlackTree;\n\n while (true) {\n circle = firstCircle;\n if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\n if (site[0] !== x || site[1] !== y) {\n addBeach(site);\n x = site[0], y = site[1];\n }\n site = sites.pop();\n } else if (circle) {\n removeBeach(circle.arc);\n } else {\n break;\n }\n }\n\n sortCellHalfedges();\n\n if (extent) {\n var x0 = +extent[0][0],\n y0 = +extent[0][1],\n x1 = +extent[1][0],\n y1 = +extent[1][1];\n clipEdges(x0, y0, x1, y1);\n clipCells(x0, y0, x1, y1);\n }\n\n this.edges = edges;\n this.cells = cells;\n\n beaches =\n circles =\n edges =\n cells = null;\n}\n\nDiagram.prototype = {\n constructor: Diagram,\n\n polygons: function() {\n var edges = this.edges;\n\n return this.cells.map(function(cell) {\n var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\n polygon.data = cell.site.data;\n return polygon;\n });\n },\n\n triangles: function() {\n var triangles = [],\n edges = this.edges;\n\n this.cells.forEach(function(cell, i) {\n if (!(m = (halfedges = cell.halfedges).length)) return;\n var site = cell.site,\n halfedges,\n j = -1,\n m,\n s0,\n e1 = edges[halfedges[m - 1]],\n s1 = e1.left === site ? e1.right : e1.left;\n\n while (++j < m) {\n s0 = s1;\n e1 = edges[halfedges[j]];\n s1 = e1.left === site ? e1.right : e1.left;\n if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\n triangles.push([site.data, s0.data, s1.data]);\n }\n }\n });\n\n return triangles;\n },\n\n links: function() {\n return this.edges.filter(function(edge) {\n return edge.right;\n }).map(function(edge) {\n return {\n source: edge.left.data,\n target: edge.right.data\n };\n });\n },\n\n find: function(x, y, radius) {\n var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\n\n // Use the previously-found cell, or start with an arbitrary one.\n while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\n var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\n\n // Traverse the half-edges to find a closer cell, if any.\n do {\n cell = that.cells[i0 = i1], i1 = null;\n cell.halfedges.forEach(function(e) {\n var edge = that.edges[e], v = edge.left;\n if ((v === cell.site || !v) && !(v = edge.right)) return;\n var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\n if (v2 < d2) d2 = v2, i1 = v.index;\n });\n } while (i1 !== null);\n\n that._found = i0;\n\n return radius == null || d2 <= radius * radius ? cell.site : null;\n }\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n return node.__zoom || identity;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// Creation of a stacked histogram with D3.js for SWH origin visits history\n// Parameters description:\n// - container: selector for the div that will contain the histogram\n// - visitsData: raw swh origin visits data\n// - currentYear: the visits year to display by default\n// - yearClickCallback: callback when the user selects a year through the histogram\n\nimport * as d3 from 'd3';\n\nexport function createVisitsHistogram(container, visitsData, currentYear, yearClickCallback) {\n\n // remove previously created histogram and tooltip if any\n d3.select(container).select('svg').remove();\n d3.select('div.d3-tooltip').remove();\n\n // histogram size and margins\n let width = 1000;\n let height = 300;\n let margin = {top: 20, right: 80, bottom: 30, left: 50};\n\n // create responsive svg\n let svg = d3.select(container)\n .attr('style',\n 'padding-bottom: ' + Math.ceil(height * 100 / width) + '%')\n .append('svg')\n .attr('viewBox', '0 0 ' + width + ' ' + height);\n\n // create tooltip div\n let tooltip = d3.select('body')\n .append('div')\n .attr('class', 'd3-tooltip')\n .style('opacity', 0);\n\n // update width and height without margins\n width = width - margin.left - margin.right;\n height = height - margin.top - margin.bottom;\n\n // create main svg group element\n let g = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // create x scale\n let x = d3.scaleTime().rangeRound([0, width]);\n\n // create y scale\n let y = d3.scaleLinear().range([height, 0]);\n\n // create ordinal colorscale mapping visit status\n let colors = d3.scaleOrdinal()\n .domain(['full', 'partial', 'failed', 'ongoing'])\n .range(['#008000', '#edc344', '#ff0000', '#0000ff']);\n\n // first SWH crawls were made in 2015\n let startYear = 2015;\n // set latest display year as the current one\n let now = new Date();\n let endYear = now.getUTCFullYear() + 1;\n let monthExtent = [new Date(Date.UTC(startYear, 0, 1)), new Date(Date.UTC(endYear, 0, 1))];\n\n // create months bins based on setup extent\n let monthBins = d3.timeMonths(d3.timeMonth.offset(monthExtent[0], -1), monthExtent[1]);\n // create years bins based on setup extent\n let yearBins = d3.timeYears(monthExtent[0], monthExtent[1]);\n\n // set x scale domain\n x.domain(d3.extent(monthBins));\n\n // use D3 histogram layout to create a function that will bin the visits by month\n let binByMonth = d3.histogram()\n .value(d => d.date)\n .domain(x.domain())\n .thresholds(monthBins);\n\n // use D3 nest function to group the visits by status\n let visitsByStatus = d3.nest()\n .key(d => d['status'])\n .sortKeys(d3.ascending)\n .entries(visitsData);\n\n // prepare data in order to be able to stack visit statuses by month\n let statuses = [];\n let histData = [];\n for (let i = 0; i < monthBins.length; ++i) {\n histData[i] = {};\n }\n visitsByStatus.forEach(entry => {\n statuses.push(entry.key);\n let monthsData = binByMonth(entry.values);\n for (let i = 0; i < monthsData.length; ++i) {\n histData[i]['x0'] = monthsData[i]['x0'];\n histData[i]['x1'] = monthsData[i]['x1'];\n histData[i][entry.key] = monthsData[i];\n }\n });\n\n // create function to stack visits statuses by month\n let stacked = d3.stack()\n .keys(statuses)\n .value((d, key) => d[key].length);\n\n // compute the maximum amount of visits by month\n let yMax = d3.max(histData, d => {\n let total = 0;\n for (let i = 0; i < statuses.length; ++i) {\n total += d[statuses[i]].length;\n }\n return total;\n });\n\n // set y scale domain\n y.domain([0, yMax]);\n\n // compute ticks values for the y axis\n let step = 5;\n let yTickValues = [];\n for (let i = 0; i <= yMax / step; ++i) {\n yTickValues.push(i * step);\n }\n if (yTickValues.length === 0) {\n for (let i = 0; i <= yMax; ++i) {\n yTickValues.push(i);\n }\n } else if (yMax % step !== 0) {\n yTickValues.push(yMax);\n }\n\n // add histogram background grid\n g.append('g')\n .attr('class', 'grid')\n .call(d3.axisLeft(y)\n .tickValues(yTickValues)\n .tickSize(-width)\n .tickFormat(''));\n\n // create one fill only rectangle by displayed year\n // each rectangle will be made visible when hovering the mouse over a year range\n // user will then be able to select a year by clicking in the rectangle\n g.append('g')\n .selectAll('rect')\n .data(yearBins)\n .enter().append('rect')\n .attr('class', d => 'year' + d.getUTCFullYear())\n .attr('fill', 'red')\n .attr('fill-opacity', d => d.getUTCFullYear() === currentYear ? 0.3 : 0)\n .attr('stroke', 'none')\n .attr('x', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return x(date);\n })\n .attr('y', 0)\n .attr('height', height)\n .attr('width', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return yearWidth;\n })\n // mouse event callbacks used to show rectangle years\n // when hovering the mouse over the histograms\n .on('mouseover', d => {\n svg.selectAll('rect.year' + d.getUTCFullYear())\n .attr('fill-opacity', 0.5);\n })\n .on('mouseout', d => {\n svg.selectAll('rect.year' + d.getUTCFullYear())\n .attr('fill-opacity', 0);\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.3);\n })\n // callback to select a year after a mouse click\n // in a rectangle year\n .on('click', d => {\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'none');\n currentYear = d.getUTCFullYear();\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.5);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'black');\n yearClickCallback(currentYear);\n });\n\n // create the stacked histogram of visits\n g.append('g')\n .selectAll('g')\n .data(stacked(histData))\n .enter().append('g')\n .attr('fill', d => colors(d.key))\n .selectAll('rect')\n .data(d => d)\n .enter().append('rect')\n .attr('class', d => 'month' + d.data.x1.getMonth())\n .attr('x', d => x(d.data.x0))\n .attr('y', d => y(d[1]))\n .attr('height', d => y(d[0]) - y(d[1]))\n .attr('width', d => x(d.data.x1) - x(d.data.x0) - 1)\n // mouse event callbacks used to show rectangle years\n // but also to show tooltip when hovering the mouse\n // over the histogram bars\n .on('mouseover', d => {\n svg.selectAll('rect.year' + d.data.x1.getUTCFullYear())\n .attr('fill-opacity', 0.5);\n tooltip.transition()\n .duration(200)\n .style('opacity', 1);\n let ds = d.data.x1.toISOString().substr(0, 7).split('-');\n let tooltipText = '' + ds[1] + ' / ' + ds[0] + ':
';\n for (let i = 0; i < statuses.length; ++i) {\n let visitStatus = statuses[i];\n let nbVisits = d.data[visitStatus].length;\n if (nbVisits === 0) continue;\n tooltipText += nbVisits + ' ' + visitStatus + ' visits';\n if (i !== statuses.length - 1) tooltipText += '
';\n }\n tooltip.html(tooltipText)\n .style('left', d3.event.pageX + 15 + 'px')\n .style('top', d3.event.pageY + 'px');\n })\n .on('mouseout', d => {\n svg.selectAll('rect.year' + d.data.x1.getUTCFullYear())\n .attr('fill-opacity', 0);\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.3);\n tooltip.transition()\n .duration(500)\n .style('opacity', 0);\n })\n .on('mousemove', () => {\n tooltip.style('left', d3.event.pageX + 15 + 'px')\n .style('top', d3.event.pageY + 'px');\n })\n // callback to select a year after a mouse click\n // inside a histogram bar\n .on('click', d => {\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'none');\n currentYear = d.data.x1.getUTCFullYear();\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.5);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'black');\n yearClickCallback(currentYear);\n });\n\n // create one stroke only rectangle by displayed year\n // that will be displayed on top of the histogram when the user has selected a year\n g.append('g')\n .selectAll('rect')\n .data(yearBins)\n .enter().append('rect')\n .attr('class', d => 'yearoutline' + d.getUTCFullYear())\n .attr('fill', 'none')\n .attr('stroke', d => d.getUTCFullYear() === currentYear ? 'black' : 'none')\n .attr('x', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return x(date);\n })\n .attr('y', 0)\n .attr('height', height)\n .attr('width', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return yearWidth;\n });\n\n // add x axis with a tick for every 1st day of each year\n let xAxis = g.append('g')\n .attr('class', 'axis')\n .attr('transform', 'translate(0,' + height + ')')\n .call(\n d3.axisBottom(x)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d => d.getUTCFullYear())\n );\n\n // shift tick labels in order to display them at the middle\n // of each year range\n xAxis.selectAll('text')\n .attr('transform', d => {\n let year = d.getUTCFullYear();\n let date = new Date(Date.UTC(year, 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return 'translate(' + -yearWidth / 2 + ', 0)';\n });\n\n // add y axis for the number of visits\n g.append('g')\n .attr('class', 'axis')\n .call(d3.axisLeft(y).tickValues(yTickValues));\n\n // add legend for visit statuses\n let legendGroup = g.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end');\n\n legendGroup.append('text')\n .attr('x', width + margin.right - 5)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text('visit status:');\n\n let legend = legendGroup.selectAll('g')\n .data(statuses.slice().reverse())\n .enter().append('g')\n .attr('transform', (d, i) => 'translate(0,' + (i + 1) * 20 + ')');\n\n legend.append('rect')\n .attr('x', width + 2 * margin.right / 3)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', colors);\n\n legend.append('text')\n .attr('x', width + 2 * margin.right / 3 - 5)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n\n // add text label for the y axis\n g.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -margin.left)\n .attr('x', -(height / 2))\n .attr('dy', '1em')\n .style('text-anchor', 'middle')\n .text('Number of visits');\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport 'bootstrap-year-calendar';\nimport 'bootstrap-year-calendar/css/bootstrap-year-calendar.css';\n\nlet minSize = 15;\nlet maxSize = 28;\nlet currentPopover = null;\nlet visitsByDate = {};\n\nfunction closePopover() {\n if (currentPopover) {\n $(currentPopover).popover('hide');\n currentPopover = null;\n }\n}\n\n// function to update the visits calendar view based on the selected year\nexport function updateCalendar(year, filteredVisits, yearClickedCallback) {\n visitsByDate = {};\n let maxNbVisitsByDate = 0;\n let minDate, maxDate;\n for (let i = 0; i < filteredVisits.length; ++i) {\n filteredVisits[i]['startDate'] = filteredVisits[i]['date'];\n filteredVisits[i]['endDate'] = filteredVisits[i]['startDate'];\n let date = new Date(filteredVisits[i]['date']);\n date.setHours(0, 0, 0, 0);\n let dateStr = date.toDateString();\n if (!visitsByDate.hasOwnProperty(dateStr)) {\n visitsByDate[dateStr] = [filteredVisits[i]];\n } else {\n visitsByDate[dateStr].push(filteredVisits[i]);\n }\n maxNbVisitsByDate = Math.max(maxNbVisitsByDate, visitsByDate[dateStr].length);\n if (i === 0) {\n minDate = maxDate = date;\n } else {\n if (date.getTime() < minDate.getTime()) {\n minDate = date;\n }\n if (date.getTime() > maxDate.getTime()) {\n maxDate = date;\n }\n }\n }\n\n closePopover();\n\n $('#swh-visits-calendar').calendar({\n dataSource: filteredVisits,\n style: 'custom',\n minDate: minDate,\n maxDate: maxDate,\n startYear: year,\n renderEnd: e => yearClickedCallback(e.currentYear),\n customDataSourceRenderer: (element, date, events) => {\n let dateStr = date.toDateString();\n let nbVisits = visitsByDate[dateStr].length;\n let t = nbVisits / maxNbVisitsByDate;\n if (maxNbVisitsByDate === 1) {\n t = 0;\n }\n let size = minSize + t * (maxSize - minSize);\n let offsetX = (maxSize - size) / 2 - parseInt($(element).css('padding-left'));\n let offsetY = (maxSize - size) / 2 - parseInt($(element).css('padding-top')) + 1;\n let cellWrapper = $('
');\n cellWrapper.css('position', 'relative');\n let dayNumber = $('
');\n dayNumber.text($(element).text());\n let circle = $('
');\n let r = 0;\n let g = 0;\n for (let i = 0; i < nbVisits; ++i) {\n let visit = visitsByDate[dateStr][i];\n if (visit.status === 'full') {\n g += 255;\n } else if (visit.status === 'partial') {\n r += 255;\n g += 255;\n } else {\n r += 255;\n }\n }\n r /= nbVisits;\n g /= nbVisits;\n circle.css('background-color', 'rgba(' + r + ', ' + g + ', 0, 0.3)');\n circle.css('width', size + 'px');\n circle.css('height', size + 'px');\n circle.css('border-radius', size + 'px');\n circle.css('position', 'absolute');\n circle.css('top', offsetY + 'px');\n circle.css('left', offsetX + 'px');\n cellWrapper.append(dayNumber);\n cellWrapper.append(circle);\n $(element)[0].innerHTML = $(cellWrapper)[0].outerHTML;\n },\n mouseOnDay: e => {\n if (currentPopover !== e.element) {\n closePopover();\n }\n let dateStr = e.date.toDateString();\n if (visitsByDate.hasOwnProperty(dateStr)) {\n\n let visits = visitsByDate[dateStr];\n let content = '
' + e.date.toDateString() + '
';\n content += '
    ';\n for (let i = 0; i < visits.length; ++i) {\n let visitTime = visits[i].fmt_date.substr(visits[i].fmt_date.indexOf(',') + 2);\n content += '
  • ' + visitTime + '
  • ';\n }\n content += '
';\n\n $(e.element).popover({\n trigger: 'manual',\n container: 'body',\n html: true,\n content: content\n });\n\n $(e.element).popover('show');\n currentPopover = e.element;\n }\n }\n });\n $('#swh-visits-timeline').mouseenter(() => {\n closePopover();\n });\n $('#swh-visits-list').mouseenter(() => {\n closePopover();\n });\n $('#swh-visits-calendar.calendar table td').css('width', maxSize + 'px');\n $('#swh-visits-calendar.calendar table td').css('height', maxSize + 'px');\n $('#swh-visits-calendar.calendar table td').css('padding', '0px');\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {createVisitsHistogram} from './visits-histogram';\nimport {updateCalendar} from './visits-calendar';\nimport './visits-reporting.css';\n\n// will hold all visits\nlet allVisits;\n// will hold filtered visits to display\nlet filteredVisits;\n// will hold currently displayed year\nlet currentYear;\n\n// function to gather full visits\nfunction filterFullVisits(differentSnapshots) {\n let filteredVisits = [];\n for (let i = 0; i < allVisits.length; ++i) {\n if (allVisits[i].status !== 'full') continue;\n if (!differentSnapshots) {\n filteredVisits.push(allVisits[i]);\n } else if (filteredVisits.length === 0) {\n filteredVisits.push(allVisits[i]);\n } else {\n let lastVisit = filteredVisits[filteredVisits.length - 1];\n if (allVisits[i].snapshot !== lastVisit.snapshot) {\n filteredVisits.push(allVisits[i]);\n }\n }\n }\n return filteredVisits;\n}\n\n// function to update the visits list view based on the selected year\nfunction updateVisitsList(year) {\n $('#swh-visits-list').children().remove();\n let visitsByYear = [];\n for (let i = 0; i < filteredVisits.length; ++i) {\n if (filteredVisits[i].date.getUTCFullYear() === year) {\n visitsByYear.push(filteredVisits[i]);\n }\n }\n let visitsCpt = 0;\n let nbVisitsByRow = 4;\n let visitsListHtml = '
';\n for (let i = 0; i < visitsByYear.length; ++i) {\n if (visitsCpt > 0 && visitsCpt % nbVisitsByRow === 0) {\n visitsListHtml += '
';\n }\n visitsListHtml += '
';\n visitsListHtml += '' + visitsByYear[i].fmt_date + '';\n visitsListHtml += '
';\n ++visitsCpt;\n }\n visitsListHtml += '
';\n $('#swh-visits-list').append($(visitsListHtml));\n}\n\nfunction yearChangedCalendar(year) {\n currentYear = year;\n updateVisitsList(year);\n createVisitsHistogram('.d3-wrapper', filteredVisits, currentYear, yearClickedTimeline);\n}\n\n// callback when the user selects a year through the visits histogram\nfunction yearClickedTimeline(year) {\n currentYear = year;\n updateCalendar(year, filteredVisits, yearChangedCalendar);\n updateVisitsList(year);\n}\n\n// function to update the visits views (histogram, calendar, list)\nfunction updateDisplayedVisits() {\n if (filteredVisits.length === 0) {\n return;\n }\n if (!currentYear) {\n currentYear = filteredVisits[filteredVisits.length - 1].date.getUTCFullYear();\n }\n createVisitsHistogram('.d3-wrapper', filteredVisits, currentYear, yearClickedTimeline);\n updateCalendar(currentYear, filteredVisits, yearChangedCalendar);\n updateVisitsList(currentYear);\n}\n\n// callback when the user only wants to see full visits pointing\n// to different snapshots (default)\nexport function showFullVisitsDifferentSnapshots(event) {\n filteredVisits = filterFullVisits(true);\n updateDisplayedVisits();\n}\n\n// callback when the user only wants to see full visits\nexport function showFullVisits(event) {\n filteredVisits = filterFullVisits(false);\n updateDisplayedVisits();\n}\n\n// callback when the user wants to see all visits (including partial, ongoing and failed ones)\nexport function showAllVisits(event) {\n filteredVisits = allVisits;\n updateDisplayedVisits();\n}\n\nexport function initVisitsReporting(visits) {\n $(document).ready(() => {\n allVisits = visits;\n // process input visits\n let firstFullVisit;\n allVisits.forEach((v, i) => {\n // Turn Unix epoch into Javascript Date object\n v.date = new Date(Math.floor(v.date * 1000));\n let visitLink = '' + v.fmt_date + '';\n if (v.status === 'full') {\n if (!firstFullVisit) {\n firstFullVisit = v;\n $('#swh-first-full-visit').append($(visitLink));\n if (allVisits.length === 1) {\n $('#swh-last-full-visit')[0].innerHTML = visitLink;\n }\n } else {\n $('#swh-last-full-visit')[0].innerHTML = visitLink;\n }\n }\n if (i === allVisits.length - 1) {\n $('#swh-last-visit').append($(visitLink));\n }\n });\n\n // display full visits pointing to different snapshots by default\n showFullVisitsDifferentSnapshots();\n });\n\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// origin visits reporting bundle\n\nexport * from './visits-reporting';\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","require('../modules/es6.parse-int');\nmodule.exports = require('../modules/_core').parseInt;\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n","var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://swh.[name]/webpack/universalModuleDefinition","webpack://swh.[name]/webpack/bootstrap","webpack://swh.[name]/./node_modules/core-js/library/modules/_global.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_export.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_descriptors.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_is-object.js","webpack://swh.[name]/./node_modules/@babel/runtime-corejs2/core-js/parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_has.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_object-dp.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_defined.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_ctx.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_a-function.js","webpack://swh.[name]/./node_modules/bootstrap-year-calendar/js/bootstrap-year-calendar.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_fails.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_dom-create.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_core.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_property-desc.js","webpack://swh.[name]/./node_modules/d3/dist/package.js","webpack://swh.[name]/./node_modules/d3-array/src/ascending.js","webpack://swh.[name]/./node_modules/d3-array/src/bisector.js","webpack://swh.[name]/./node_modules/d3-array/src/bisect.js","webpack://swh.[name]/./node_modules/d3-array/src/cross.js","webpack://swh.[name]/./node_modules/d3-array/src/extent.js","webpack://swh.[name]/./node_modules/d3-array/src/array.js","webpack://swh.[name]/./node_modules/d3-array/src/constant.js","webpack://swh.[name]/./node_modules/d3-array/src/identity.js","webpack://swh.[name]/./node_modules/d3-array/src/range.js","webpack://swh.[name]/./node_modules/d3-array/src/ticks.js","webpack://swh.[name]/./node_modules/d3-array/src/threshold/sturges.js","webpack://swh.[name]/./node_modules/d3-array/src/histogram.js","webpack://swh.[name]/./node_modules/d3-array/src/max.js","webpack://swh.[name]/./node_modules/d3-array/src/merge.js","webpack://swh.[name]/./node_modules/d3-array/src/zip.js","webpack://swh.[name]/./node_modules/d3-axis/src/array.js","webpack://swh.[name]/./node_modules/d3-axis/src/identity.js","webpack://swh.[name]/./node_modules/d3-axis/src/axis.js","webpack://swh.[name]/./node_modules/d3-dispatch/src/dispatch.js","webpack://swh.[name]/./node_modules/d3-selection/src/namespaces.js","webpack://swh.[name]/./node_modules/d3-selection/src/namespace.js","webpack://swh.[name]/./node_modules/d3-selection/src/creator.js","webpack://swh.[name]/./node_modules/d3-selection/src/selector.js","webpack://swh.[name]/./node_modules/d3-selection/src/selectorAll.js","webpack://swh.[name]/./node_modules/d3-selection/src/matcher.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/sparse.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/enter.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/data.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/sort.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/attr.js","webpack://swh.[name]/./node_modules/d3-selection/src/window.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/style.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/classed.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/text.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/html.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/raise.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/lower.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/insert.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/remove.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/clone.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/on.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/dispatch.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/index.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/select.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/selectAll.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/filter.js","webpack://swh.[name]/./node_modules/d3-selection/src/constant.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/exit.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/merge.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/order.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/call.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/nodes.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/node.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/size.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/empty.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/each.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/property.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/append.js","webpack://swh.[name]/./node_modules/d3-selection/src/selection/datum.js","webpack://swh.[name]/./node_modules/d3-selection/src/select.js","webpack://swh.[name]/./node_modules/d3-selection/src/local.js","webpack://swh.[name]/./node_modules/d3-drag/src/drag.js","webpack://swh.[name]/./node_modules/d3-color/src/define.js","webpack://swh.[name]/./node_modules/d3-color/src/color.js","webpack://swh.[name]/./node_modules/d3-color/src/math.js","webpack://swh.[name]/./node_modules/d3-color/src/lab.js","webpack://swh.[name]/./node_modules/d3-color/src/cubehelix.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/basis.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/constant.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/color.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/rgb.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/number.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/basisClosed.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/string.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/parse.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/value.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/date.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/array.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/object.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/round.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/transform/index.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/zoom.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/hsl.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/hcl.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/cubehelix.js","webpack://swh.[name]/./node_modules/d3-interpolate/src/quantize.js","webpack://swh.[name]/./node_modules/d3-timer/src/timer.js","webpack://swh.[name]/./node_modules/d3-timer/src/timeout.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/schedule.js","webpack://swh.[name]/./node_modules/d3-transition/src/interrupt.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/tween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/interpolate.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/remove.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/selection.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/text.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/index.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/select.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/selectAll.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/filter.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/merge.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/transition.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/on.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/attr.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/attrTween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/style.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/styleTween.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/delay.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/duration.js","webpack://swh.[name]/./node_modules/d3-transition/src/transition/ease.js","webpack://swh.[name]/./node_modules/d3-ease/src/poly.js","webpack://swh.[name]/./node_modules/d3-ease/src/sin.js","webpack://swh.[name]/./node_modules/d3-ease/src/back.js","webpack://swh.[name]/./node_modules/d3-ease/src/elastic.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/transition.js","webpack://swh.[name]/./node_modules/d3-ease/src/cubic.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/index.js","webpack://swh.[name]/./node_modules/d3-transition/src/selection/interrupt.js","webpack://swh.[name]/./node_modules/d3-brush/src/brush.js","webpack://swh.[name]/./node_modules/d3-chord/src/math.js","webpack://swh.[name]/./node_modules/d3-chord/src/array.js","webpack://swh.[name]/./node_modules/d3-chord/src/chord.js","webpack://swh.[name]/./node_modules/d3-path/src/path.js","webpack://swh.[name]/./node_modules/d3-chord/src/ribbon.js","webpack://swh.[name]/./node_modules/d3-collection/src/map.js","webpack://swh.[name]/./node_modules/d3-collection/src/nest.js","webpack://swh.[name]/./node_modules/d3-collection/src/set.js","webpack://swh.[name]/./node_modules/d3-contour/src/array.js","webpack://swh.[name]/./node_modules/d3-contour/src/density.js","webpack://swh.[name]/./node_modules/d3-dsv/src/dsv.js","webpack://swh.[name]/./node_modules/d3-dsv/src/csv.js","webpack://swh.[name]/./node_modules/d3-dsv/src/tsv.js","webpack://swh.[name]/./node_modules/d3-fetch/src/text.js","webpack://swh.[name]/./node_modules/d3-fetch/src/dsv.js","webpack://swh.[name]/./node_modules/d3-fetch/src/xml.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/add.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/cover.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/quad.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/quadtree.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/data.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/extent.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/find.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/remove.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/root.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/size.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/visit.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/visitAfter.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/x.js","webpack://swh.[name]/./node_modules/d3-quadtree/src/y.js","webpack://swh.[name]/./node_modules/d3-force/src/simulation.js","webpack://swh.[name]/./node_modules/d3-format/src/formatDecimal.js","webpack://swh.[name]/./node_modules/d3-format/src/exponent.js","webpack://swh.[name]/./node_modules/d3-format/src/formatSpecifier.js","webpack://swh.[name]/./node_modules/d3-format/src/formatTrim.js","webpack://swh.[name]/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://swh.[name]/./node_modules/d3-format/src/defaultLocale.js","webpack://swh.[name]/./node_modules/d3-format/src/formatRounded.js","webpack://swh.[name]/./node_modules/d3-format/src/formatTypes.js","webpack://swh.[name]/./node_modules/d3-format/src/identity.js","webpack://swh.[name]/./node_modules/d3-format/src/locale.js","webpack://swh.[name]/./node_modules/d3-format/src/formatNumerals.js","webpack://swh.[name]/./node_modules/d3-format/src/formatGroup.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionFixed.js","webpack://swh.[name]/./node_modules/d3-geo/src/adder.js","webpack://swh.[name]/./node_modules/d3-geo/src/math.js","webpack://swh.[name]/./node_modules/d3-geo/src/noop.js","webpack://swh.[name]/./node_modules/d3-geo/src/area.js","webpack://swh.[name]/./node_modules/d3-geo/src/cartesian.js","webpack://swh.[name]/./node_modules/d3-geo/src/bounds.js","webpack://swh.[name]/./node_modules/d3-geo/src/rotation.js","webpack://swh.[name]/./node_modules/d3-geo/src/circle.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/buffer.js","webpack://swh.[name]/./node_modules/d3-geo/src/pointEqual.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/rejoin.js","webpack://swh.[name]/./node_modules/d3-geo/src/polygonContains.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/index.js","webpack://swh.[name]/./node_modules/d3-geo/src/clip/antimeridian.js","webpack://swh.[name]/./node_modules/d3-geo/src/length.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/area.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/measure.js","webpack://swh.[name]/./node_modules/d3-geo/src/path/string.js","webpack://swh.[name]/./node_modules/d3-geo/src/transform.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/resample.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/index.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthal.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthalEqualArea.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/azimuthalEquidistant.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/equirectangular.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/conicEquidistant.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/equalEarth.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/gnomonic.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/orthographic.js","webpack://swh.[name]/./node_modules/d3-geo/src/projection/stereographic.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/count.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/index.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/each.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/sum.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/sort.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/path.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/ancestors.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/descendants.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/leaves.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/hierarchy/links.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/array.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/round.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/dice.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/tree.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/slice.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/squarify.js","webpack://swh.[name]/./node_modules/d3-hierarchy/src/treemap/resquarify.js","webpack://swh.[name]/./node_modules/d3-polygon/src/hull.js","webpack://swh.[name]/./node_modules/d3-random/src/defaultSource.js","webpack://swh.[name]/./node_modules/d3-random/src/normal.js","webpack://swh.[name]/./node_modules/d3-random/src/uniform.js","webpack://swh.[name]/./node_modules/d3-random/src/irwinHall.js","webpack://swh.[name]/./node_modules/d3-random/src/logNormal.js","webpack://swh.[name]/./node_modules/d3-scale/src/array.js","webpack://swh.[name]/./node_modules/d3-random/src/bates.js","webpack://swh.[name]/./node_modules/d3-random/src/exponential.js","webpack://swh.[name]/./node_modules/d3-scale/src/ordinal.js","webpack://swh.[name]/./node_modules/d3-scale/src/constant.js","webpack://swh.[name]/./node_modules/d3-scale/src/number.js","webpack://swh.[name]/./node_modules/d3-scale/src/continuous.js","webpack://swh.[name]/./node_modules/d3-scale/src/tickFormat.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionRound.js","webpack://swh.[name]/./node_modules/d3-format/src/precisionPrefix.js","webpack://swh.[name]/./node_modules/d3-scale/src/linear.js","webpack://swh.[name]/./node_modules/d3-scale/src/nice.js","webpack://swh.[name]/./node_modules/d3-time/src/interval.js","webpack://swh.[name]/./node_modules/d3-time/src/millisecond.js","webpack://swh.[name]/./node_modules/d3-time/src/duration.js","webpack://swh.[name]/./node_modules/d3-time/src/second.js","webpack://swh.[name]/./node_modules/d3-time/src/minute.js","webpack://swh.[name]/./node_modules/d3-time/src/hour.js","webpack://swh.[name]/./node_modules/d3-time/src/day.js","webpack://swh.[name]/./node_modules/d3-time/src/week.js","webpack://swh.[name]/./node_modules/d3-time/src/month.js","webpack://swh.[name]/./node_modules/d3-time/src/year.js","webpack://swh.[name]/./node_modules/d3-time/src/utcMinute.js","webpack://swh.[name]/./node_modules/d3-time/src/utcHour.js","webpack://swh.[name]/./node_modules/d3-time/src/utcDay.js","webpack://swh.[name]/./node_modules/d3-time/src/utcWeek.js","webpack://swh.[name]/./node_modules/d3-time/src/utcMonth.js","webpack://swh.[name]/./node_modules/d3-time/src/utcYear.js","webpack://swh.[name]/./node_modules/d3-time-format/src/locale.js","webpack://swh.[name]/./node_modules/d3-time-format/src/defaultLocale.js","webpack://swh.[name]/./node_modules/d3-time-format/src/isoFormat.js","webpack://swh.[name]/./node_modules/d3-time-format/src/isoParse.js","webpack://swh.[name]/./node_modules/d3-scale/src/time.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/colors.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/ramp.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/category10.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Accent.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Dark2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Paired.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set1.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set2.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/categorical/Set3.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/BrBG.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PRGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PiYG.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/PuOr.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdGy.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/diverging/Spectral.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js","webpack://swh.[name]/./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js","webpack://swh.[name]/./node_modules/d3-shape/src/constant.js","webpack://swh.[name]/./node_modules/d3-shape/src/math.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/linear.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/radial.js","webpack://swh.[name]/./node_modules/d3-shape/src/lineRadial.js","webpack://swh.[name]/./node_modules/d3-shape/src/array.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/diamond.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/circle.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/star.js","webpack://swh.[name]/./node_modules/d3-shape/src/noop.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/triangle.js","webpack://swh.[name]/./node_modules/d3-shape/src/symbol/wye.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/basis.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/bundle.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinal.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRom.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/monotone.js","webpack://swh.[name]/./node_modules/d3-shape/src/curve/natural.js","webpack://swh.[name]/./node_modules/d3-shape/src/offset/none.js","webpack://swh.[name]/./node_modules/d3-shape/src/order/none.js","webpack://swh.[name]/./node_modules/d3-shape/src/stack.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/RedBlackTree.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Edge.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Cell.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Circle.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Beach.js","webpack://swh.[name]/./node_modules/d3-voronoi/src/Diagram.js","webpack://swh.[name]/./node_modules/d3-zoom/src/transform.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-histogram.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-calendar.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/visits-reporting.js","webpack://swh.[name]/./swh/web/assets/src/bundles/origin/index.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_string-ws.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_an-object.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_to-primitive.js","webpack://swh.[name]/./node_modules/core-js/library/fn/parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/es6.parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_parse-int.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_string-trim.js","webpack://swh.[name]/./node_modules/core-js/library/modules/_hide.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","global","Math","self","Function","__g","core","ctx","hide","has","PROTOTYPE","$export","type","source","own","out","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","S","IS_PROTO","P","IS_BIND","B","IS_WRAP","W","expProto","target","undefined","C","a","b","this","arguments","length","apply","virtual","R","U","it","anObject","IE8_DOM_DEFINE","toPrimitive","dP","f","O","Attributes","e","TypeError","aFunction","fn","that","$","Calendar","element","options","addClass","_initializeEvents","_initializeOptions","setYear","startYear","constructor","opt","isNaN","parseInt","Date","getFullYear","minDate","maxDate","language","dates","allowOverlap","displayWeekNumber","displayDisabledDataSource","displayHeader","alwaysHalfDay","enableRangeSelection","disabledDays","Array","disabledWeekDays","hiddenWeekDays","roundRangeLimits","dataSource","style","enableContextMenu","contextMenuItems","customDayRenderer","isFunction","customDataSourceRenderer","weekStart","_initializeDatasourceColors","yearChanged","renderEnd","clickDay","dayContextMenu","selectRange","mouseOnDay","mouseOutDay","color","colors","render","empty","_renderHeader","_renderBody","_renderDataSource","_applyEvents","find","fadeIn","_triggerEvent","currentYear","header","document","createElement","headerBody","headerTable","prevDiv","prevIcon","append","prev2YearDiv","text","prevYearDiv","yearDiv","nextYearDiv","next2YearDiv","nextDiv","nextIcon","monthsDiv","bsRow","monthDiv","data","firstDate","table","thead","titleRow","titleCell","attr","months","headerRow","weekNumberCell","weekShort","headerCell","daysMin","_isHidden","currentDate","getTime","lastDate","getDay","setDate","getDate","row","getWeekNumber","cell","_isDisabled","cellContent","_this","each","month","monthData","startDate","endDate","push","nextDate","dayData","_renderDataSourceDay","elt","events","weight","parent","css","boxShadow","currentTime","startHalfDay","otherColor","endHalfDay","click","hasClass","animate","margin-left","setTimeout","cells","stopPropagation","date","_getDate","which","getEvents","preventDefault","_openContextMenu","mousedown","_mouseDown","_rangeStart","_rangeEnd","_refreshRange","mouseenter","newDate","getMonth","oldValue","mouseup","getEventsOnRange","mouseleave","setInterval","calendarSize","width","monthSize","first","monthContainerClass","removeClass","monthId","contextMenu","eventItem","eventItemContent","icon","_renderContextMenuItems","children","offset","left","top","show","one","items","evt","subMenu","visible","menuItem","menuItemContent","index","_getColor","colorString","day","closest","year","eventName","parameters","event","Event","trigger","tempDate","setHours","week1","round","getYear","parsedYear","preventRendering","getMinDate","setMinDate","getMaxDate","setMaxDate","getStyle","setStyle","getAllowOverlap","setAllowOverlap","getDisplayWeekNumber","setDisplayWeekNumber","getDisplayHeader","setDisplayHeader","getDisplayDisabledDataSource","setDisplayDisabledDataSource","getAlwaysHalfDay","setAlwaysHalfDay","getEnableRangeSelection","setEnableRangeSelection","getDisabledDays","setDisabledDays","getDisabledWeekDays","setDisabledWeekDays","getHiddenWeekDays","setHiddenWeekDays","getRoundRangeLimits","setRoundRangeLimits","getEnableContextMenu","setEnableContextMenu","getContextMenuItems","setContextMenuItems","getCustomDayRenderer","setCustomDayRenderer","getCustomDataSourceRenderer","setCustomDataSourceRenderer","getLanguage","setLanguage","getDataSource","setDataSource","getWeekStart","setWeekStart","addEvent","calendar","fct","en","days","daysShort","monthsShort","jQuery","exec","isObject","is","version","__e","bitmap","configurable","writable","ascending","NaN","bisector","compare","x","lo","hi","mid","right","ascendingBisect","bisectRight","bisect","src_extent","values","valueof","min","max","array_array","slice","constant","map","identity","src_range","start","stop","step","ceil","range","e10","sqrt","e5","e2","ticks","count","reverse","tickIncrement","isFinite","floor","power","log","LN10","error","pow","tickStep","step0","abs","step1","sturges","LN2","src_histogram","domain","threshold","histogram","xz","x0","x1","tz","isArray","shift","pop","bin","bins","_","thresholds","src_max","src_merge","arrays","merged","array","j","array_slice","src_identity","axis_top","axis_right","axis_bottom","axis_left","epsilon","translateX","translateY","y","entering","__axis","axis_axis","orient","scale","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","k","transform","axis","context","format","spacing","range0","range1","position","bandwidth","copy","selection","path","selectAll","tick","order","tickExit","exit","tickEnter","enter","line","select","merge","insert","transition","getAttribute","parentNode","remove","filter","tickSize","axisLeft","noop","dispatch","Error","Dispatch","set","callback","concat","on","typename","types","T","trim","split","indexOf","args","src_dispatch","xhtml","namespaces","svg","xlink","xml","xmlns","namespace","prefix","space","local","creator","fullname","ownerDocument","createElementNS","uri","namespaceURI","documentElement","none","src_selector","selector","querySelector","selectorAll_empty","selectorAll","querySelectorAll","matcher","matches","matcher_element","vendorMatches","webkitMatchesSelector","msMatchesSelector","mozMatchesSelector","oMatchesSelector","src_matcher","sparse","update","EnterNode","datum","_next","_parent","__data__","appendChild","child","insertBefore","next","bindIndex","group","node","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","keyValues","sort_ascending","src_window","defaultView","styleValue","getPropertyValue","getComputedStyle","classArray","string","classList","ClassList","_node","_names","classedAdd","names","list","add","classedRemove","setAttribute","join","splice","contains","textRemove","textContent","htmlRemove","innerHTML","raise","nextSibling","lower","previousSibling","firstChild","constantNull","removeChild","selection_cloneShallow","cloneNode","selection_cloneDeep","filterEvents","on_event","filterContextListener","listener","contextListener","related","relatedTarget","compareDocumentPosition","event1","event0","onRemove","__on","removeEventListener","capture","onAdd","wrap","addEventListener","dispatchEvent","params","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","selection_root","Selection","groups","parents","_groups","_parents","selection_selection","subgroups","subnode","subgroup","match","size","enterGroup","updateGroup","previous","i0","i1","_enter","_exit","groups0","groups1","m0","m1","merges","group0","group1","sort","compareNode","sortgroups","sortgroup","nodes","getAttributeNS","removeAttributeNS","removeAttribute","v","setAttributeNS","priority","removeProperty","setProperty","classed","html","before","clone","deep","typenames","src_selection","src_select","nextId","Local","toString","id","extend","definition","Color","brighter","reI","reN","reP","reHex3","reHex6","reRgbInteger","RegExp","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_color","toLowerCase","Rgb","rgbn","rgba","hsla","g","rgbConvert","rgb","opacity","color_rgb","hex","h","Hsl","hsl","hslConvert","hsl2rgb","m2","displayable","darker","deg2rad","PI","rad2deg","Xn","Yn","Zn","lab_t0","lab_t1","lab_t2","t3","labConvert","Lab","Hcl","cos","sin","z","rgb2lrgb","xyz2lab","lab","lab2xyz","lrgb2rgb","hclConvert","atan2","hcl","cubehelix_B","cubehelix_D","cubehelix_E","ED","EB","BC_DA","cubehelix_cubehelix","Cubehelix","bl","cubehelixConvert","basis","t1","v0","v1","v2","v3","t2","cosh","sinh","d3_interpolate_src_constant","linear","color_hue","gamma","nogamma","src_rgb","rgbGamma","end","rgbSpline","spline","rgbBasis","src_number","reA","reB","cssNode","cssRoot","cssView","svgNode","src_string","am","bm","bs","bi","lastIndex","q","src_value","setTime","nb","na","valueOf","src_round","degrees","decompose_identity","rotate","skewX","scaleX","scaleY","decompose","atan","interpolateTransform","parse","pxComma","pxParen","degParen","xa","ya","xb","yb","translate","interpolateTransformCss","interpolateTransformSvg","baseVal","consolidate","matrix","SQRT2","hsl_hsl","hue","hcl_hcl","src_cubehelix_cubehelix","cubehelixGamma","cubehelix","cubehelixLong","taskHead","taskTail","timer_frame","timeout","timer_interval","pokeDelay","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","timer_now","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","timerFlush","t0","Infinity","sleep","nap","poke","clearTimeout","clearInterval","src_timeout","elapsed","emptyOn","emptyTween","CREATED","STARTING","transition_schedule","timing","schedules","__transition","tween","state","duration","ease","schedule_create","schedule_init","schedule","schedule_get","schedule_set","interrupt","active","tweenValue","_id","transition_interpolate","selection_Selection","transition_id","Transition","_name","newId","selection_prototype","inherit","id0","id1","on0","on1","sit","every","attrTween","interpolate","value00","value10","interpolate0","value0","value1","_value","styleTween","tween0","tween1","easeConstant","custom","polyIn","exponent","polyOut","polyInOut","overshoot","tau","backIn","backOut","backInOut","defaultTiming","asin","elasticIn","amplitude","period","elasticOut","elasticInOut","transition_inherit","brush_type","path_pi","path_tau","path_epsilon","tauEpsilon","Path","_x0","_y0","_x1","_y1","moveTo","closePath","lineTo","quadraticCurveTo","y1","bezierCurveTo","x2","y2","arcTo","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","acos","t01","t21","arc","a0","a1","ccw","dx","dy","cw","da","rect","w","map_prefix","Map","map_map","clear","keys","entries","src_map","src_nest","sortValues","rollup","nest","sortKeys","depth","createResult","setResult","valuesByKey","result","createObject","setObject","createMap","setMap","sortKey","Set","proto","EOL","EOF","objectConverter","columns","JSON","stringify","dsv","delimiter","reFormat","DELIMITER","charCodeAt","parseRows","rows","N","I","eof","eol","token","replace","formatRow","formatValue","test","convert","columnSet","forEach","column","formatRows","csv","csvParse","tsv","tsvParse","responseText","response","ok","status","statusText","src_text","input","init","fetch","then","dsvParse","parser","DOMParser","parseFromString","add_add","tree","xm","ym","xp","yp","bottom","_root","leaf","_x","_y","src_quad","Quadtree","leaf_copy","treeProto","cover","addAll","yz","visit","extent","radius","x3","y3","quads","d2","retainer","removeAll","visitAfter","formatDecimal","toExponential","coefficient","src_exponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","sign","symbol","zero","comma","precision","prefixExponent","defaultLocale_locale","defaultLocale_format","defaultLocale_formatPrefix","formatRounded","formatTypes","%","toFixed","toPrecision","X","toUpperCase","d3_format_src_identity","prefixes","locale","numerals","grouping","thousands","substring","currency","decimal","percent","newFormat","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatTrim","padding","formatPrefix","src_locale","adder","Adder","reset","adder_add","temp","bv","av","math_epsilon","src_math_pi","src_math_halfPi","quarterPi","src_math_tau","radians","math_cos","exp","math_sin","noop_noop","cartesian_cartesian","spherical","lambda","phi","cosPhi","cartesianCross","cartesianNormalizeInPlace","rotationIdentity","invert","clip_buffer","lines","point","lineStart","lineEnd","rejoin","pointEqual","Intersection","points","other","entry","segments","compareIntersection","startInside","stream","subject","clip","segment","p0","p1","rejoin_link","current","isSubject","polygonContains_sum","polygonContains","polygon","sinPhi","normal","angle","winding","ring","point0","lambda0","phi0","sinPhi0","cosPhi0","lambda1","sinPhi1","cosPhi1","point1","phi1","delta","absDelta","antimeridian","intersection","phiArc","src_clip","pointVisible","clipLine","sink","ringBuffer","ringSink","polygonStarted","polygonStart","pointRing","ringStart","ringEnd","polygonEnd","clip_compareIntersection","sphere","pointLine","clean","ringSegments","validSegment","sign0","sinLambda0Lambda1","sign1","from","to","direction","string_circle","transformer","methods","TransformStream","azimuthalRaw","cx","cy","azimuthalInvert","sc","cc","azimuthalEqualAreaRaw","cxcy","azimuthalEquidistantRaw","equirectangularRaw","A1","A2","A3","A4","M","count_count","sum","hierarchy","childs","Node","valued","defaultChildren","eachBefore","computeHeight","copyData","height","eachAfter","ancestor","aNodes","ancestors","bNodes","leastCommonAncestor","descendants","leaves","links","dice","treemap_slice","squarify_phi","squarifyRatio","ratio","nodeValue","sumValue","minValue","maxValue","newRatio","minRatio","alpha","beta","squarify","resquarify","_squarify","src_defaultSource","random","src_normal","sourceRandomUniform","randomUniform","sourceRandomNormal","randomNormal","mu","sigma","irwinHall","sourceRandomLogNormal","randomLogNormal","sourceRandomIrwinHall","randomIrwinHall","d3_scale_src_array_array","sourceRandomBates","randomBates","sourceRandomExponential","randomExponential","array_map","d3_scale_src_array_slice","implicit","ordinal","unknown","d3_scale_src_constant","d3_scale_src_number","unit","deinterpolateLinear","bimap","deinterpolate","reinterpolate","d0","d1","r0","r1","polymap","clamp","continuous","piecewise","output","rescale","rangeRound","src_tickFormat","linearish","nice","interval","interval_t0","interval_t1","newInterval","floori","offseti","field","millisecond_millisecond","src_millisecond","durationMinute","durationHour","second_second","getUTCSeconds","src_second","minute_minute","getMinutes","src_minute","hour_hour","getTimezoneOffset","getHours","src_hour","day_day","src_day","weekday","sunday","monday","tuesday","wednesday","thursday","friday","saturday","month_month","setMonth","src_month","year_year","setFullYear","src_year","years","utcMinute","setUTCSeconds","getUTCMinutes","utcHour","setUTCMinutes","getUTCHours","utcDay","setUTCHours","setUTCDate","getUTCDate","src_utcDay","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcMonth","setUTCMonth","getUTCMonth","getUTCFullYear","utcYear","setUTCFullYear","src_utcYear","localDate","H","L","utcDate","UTC","newYear","src_defaultLocale_locale","timeFormat","utcFormat","utcParse","pads","-","0","numberRe","percentRe","requoteRe","pad","requote","formatRe","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","u","parseWeekNumberSunday","parseWeekNumberISO","V","parseWeekNumberMonday","parseFullYear","parseYear","parseZone","Z","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","getMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","getSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","locale_formatYear","formatFullYear","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","locale_shortWeekdays","shortDays","locale_months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","A","Y","utcFormats","parses","parseSpecifier","charAt","newParse","week","formatLocale","isoSpecifier","toISOString","time_durationSecond","time_durationMinute","time_durationHour","time_durationDay","time_durationWeek","durationMonth","durationYear","time_date","time_number","hour","minute","second","millisecond","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","formatYear","tickIntervals","tickInterval","src_time","src_colors","ramp","scheme","viridis_ramp","d3_shape_src_constant","src_math_epsilon","d3_shape_src_math_pi","d3_shape_src_math_tau","Linear","_context","areaStart","_line","areaEnd","_point","curve_linear","curveRadial","Radial","curve","_curve","radial","d3_shape_src_array_slice","kr","d3_shape_src_noop","basis_point","Basis","Bundle","_basis","_beta","bundle","cardinal_point","_k","_x2","_y2","Cardinal","tension","cardinal","CardinalClosed","_x3","_x4","_x5","_y3","_y4","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","_l23_2a","CatmullRom","_alpha","x23","y23","catmullRom","CatmullRomClosed","CatmullRomOpen","monotone_sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","controlPoints","_t0","offset_none","series","order_none","stackValue","src_stack","stack","oz","kz","sz","sij","ki","si","RedBlackTree","RedBlackNode","RedBlackRotateLeft","RedBlackRotateRight","RedBlackFirst","after","grandpa","uncle","sibling","src_RedBlackTree","createEdge","edge","Diagram_edges","setEdgeEnd","halfedges","createBorderEdge","vertex","clipEdge","ax","ay","connectEdge","fm","fb","lx","ly","rx","ry","fx","fy","cellHalfedgeStart","site","firstCircle","circlePool","Circle","attachCircle","lArc","rArc","lSite","cSite","rSite","bx","by","Diagram_epsilon2","ha","hc","circle","Diagram_circles","detachCircle","beachPool","Beach","createBeach","beach","detachBeach","beaches","removeBeach","disappearing","Diagram_epsilon","unshift","iArc","nArcs","addBeach","dxl","dxr","directrix","leftBreakPoint","rightBreakPoint","newArc","hb","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","lexicographic","Diagram","sites","vb","va","sortCellHalfedges","clipEdges","iCell","iHalfedge","nHalfedges","startX","startY","endX","endY","nCells","dc","v00","v01","v11","v10","clipCells","edges","polygons","triangles","e1","_found","vx","vy","Transform","applyX","applyY","location","invertX","invertY","rescaleX","rescaleY","createVisitsHistogram","container","visitsData","yearClickCallback","d3","margin","tooltip","src_linear_linear","endYear","monthExtent","monthBins","yearBins","binByMonth","visitsByStatus","statuses","histData","monthsData","stacked","yMax","total","yTickValues","ds","substr","tooltipText","visitStatus","nbVisits","pageX","pageY","legendGroup","legend","minSize","maxSize","currentPopover","visitsByDate","closePopover","popover","updateCalendar","filteredVisits","yearClickedCallback","maxNbVisitsByDate","dateStr","toDateString","offsetX","parse_int_default","offsetY","cellWrapper","dayNumber","outerHTML","visits","content","visitTime","fmt_date","browse_url","allVisits","filterFullVisits","differentSnapshots","lastVisit","snapshot","updateVisitsList","visitsByYear","visitsCpt","visitsListHtml","yearChangedCalendar","yearClickedTimeline","updateDisplayedVisits","showFullVisitsDifferentSnapshots","showFullVisits","showAllVisits","initVisitsReporting","ready","firstFullVisit","visitLink","__webpack_exports__","val","$parseInt","$trim","ws","str","radix","String","defined","fails","spaces","ltrim","rtrim","exporter","KEY","ALIAS","FORCE","TYPE","createDesc"],"mappings":"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A,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCESC,GAZE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA5G,IAAM8uC,KCASC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA5G,IAAM8uC,KCESC,GAVE,IAAA/9C,MAAA,GAAA4V,OACjB,qBACA,2BACA,iCACA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","file":"js/origin.6b57666194b71082b679.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"origin\"] = factory();\n\telse\n\t\troot[\"swh\"] = root[\"swh\"] || {}, root[\"swh\"][\"origin\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 227);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = require(\"core-js/library/fn/parse-int\");","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","/* =========================================================\n * Bootstrap year calendar v1.1.0\n * Repo: https://github.com/Paul-DS/bootstrap-year-calendar\n * =========================================================\n * BOOTSTRAP 4 Integration by Raul Neiva\n * =========================================================\n * Created by Paul David-Sivelle\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n \n (function($) {\n\tvar Calendar = function(element, options) {\n\t\tthis.element = element;\n\t\tthis.element.addClass('calendar');\n\t\t\n\t\tthis._initializeEvents(options);\n\t\tthis._initializeOptions(options);\n\t\tthis.setYear(this.options.startYear);\n\t};\n \n\tCalendar.prototype = {\n\t\tconstructor: Calendar,\n\t\t_initializeOptions: function(opt) {\n\t\t\tif(opt == null) {\n\t\t\t\topt = [];\n\t\t\t}\n\t\t\n\t\t\tthis.options = {\n\t\t\t\tstartYear: !isNaN(parseInt(opt.startYear)) ? parseInt(opt.startYear) : new Date().getFullYear(),\n\t\t\t\tminDate: opt.minDate instanceof Date ? opt.minDate : null,\n\t\t\t\tmaxDate: opt.maxDate instanceof Date ? opt.maxDate : null,\n\t\t\t\tlanguage: (opt.language != null && dates[opt.language] != null) ? opt.language : 'en',\n\t\t\t\tallowOverlap: opt.allowOverlap != null ? opt.allowOverlap : true,\n\t\t\t\tdisplayWeekNumber: opt.displayWeekNumber != null ? opt.displayWeekNumber : false,\n\t\t\t\tdisplayDisabledDataSource: opt.displayDisabledDataSource != null ? opt.displayDisabledDataSource : false,\n\t\t\t\tdisplayHeader: opt.displayHeader != null ? opt.displayHeader : true,\n\t\t\t\talwaysHalfDay: opt.alwaysHalfDay != null ? opt.alwaysHalfDay : false,\n\t\t\t\tenableRangeSelection: opt.enableRangeSelection != null ? opt.enableRangeSelection : false,\n\t\t\t\tdisabledDays: opt.disabledDays instanceof Array ? opt.disabledDays : [],\n\t\t\t\tdisabledWeekDays: opt.disabledWeekDays instanceof Array ? opt.disabledWeekDays : [],\n\t\t\t\thiddenWeekDays: opt.hiddenWeekDays instanceof Array ? opt.hiddenWeekDays : [],\n\t\t\t\troundRangeLimits: opt.roundRangeLimits != null ? opt.roundRangeLimits : false,\n\t\t\t\tdataSource: opt.dataSource instanceof Array ? opt.dataSource : [],\n\t\t\t\tstyle: opt.style == 'background' || opt.style == 'border' || opt.style == 'custom' ? opt.style : 'border',\n\t\t\t\tenableContextMenu: opt.enableContextMenu != null ? opt.enableContextMenu : false,\n\t\t\t\tcontextMenuItems: opt.contextMenuItems instanceof Array ? opt.contextMenuItems : [],\n\t\t\t\tcustomDayRenderer : $.isFunction(opt.customDayRenderer) ? opt.customDayRenderer : null,\n\t\t\t\tcustomDataSourceRenderer : $.isFunction(opt.customDataSourceRenderer) ? opt.customDataSourceRenderer : null,\n\t\t\t\tweekStart: !isNaN(parseInt(opt.weekStart)) ? parseInt(opt.weekStart) : null\n\t\t\t};\n\t\t\t\n\t\t\tthis._initializeDatasourceColors();\n\t\t},\n\t\t_initializeEvents: function(opt) {\n\t\t\tif(opt == null) {\n\t\t\t\topt = [];\n\t\t\t}\n\t\t\n\t\t\tif(opt.yearChanged) { this.element.bind('yearChanged', opt.yearChanged); }\n\t\t\tif(opt.renderEnd) { this.element.bind('renderEnd', opt.renderEnd); }\n\t\t\tif(opt.clickDay) { this.element.bind('clickDay', opt.clickDay); }\n\t\t\tif(opt.dayContextMenu) { this.element.bind('dayContextMenu', opt.dayContextMenu); }\n\t\t\tif(opt.selectRange) { this.element.bind('selectRange', opt.selectRange); }\n\t\t\tif(opt.mouseOnDay) { this.element.bind('mouseOnDay', opt.mouseOnDay); }\n\t\t\tif(opt.mouseOutDay) { this.element.bind('mouseOutDay', opt.mouseOutDay); }\n\t\t},\n\t\t_initializeDatasourceColors: function() {\n\t\t\tfor(var i = 0; i < this.options.dataSource.length; i++) {\n\t\t\t\tif(this.options.dataSource[i].color == null) {\n\t\t\t\t\tthis.options.dataSource[i].color = colors[i % colors.length];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\trender: function() {\n\t\t\tthis.element.empty();\n\t\t\t\n\t\t\tif(this.options.displayHeader) {\n\t\t\t\tthis._renderHeader();\n\t\t\t}\n\t\t\t\n\t\t\tthis._renderBody();\n\t\t\tthis._renderDataSource();\n\t\t\t\n\t\t\tthis._applyEvents();\n\t\t\tthis.element.find('.months-container').fadeIn(500);\n\t\t\t\n\t\t\tthis._triggerEvent('renderEnd', { currentYear: this.options.startYear });\n\t\t},\n\t\t_renderHeader: function() {\n\t\t\tvar header = $(document.createElement('div'));\n\t\t\theader.addClass('calendar-header card');\n\n\t\t\tvar headerBody = $(document.createElement('div'));\n\t\t\theaderBody.addClass('card-body p-0');\n\t\t\t\n\t\t\tvar headerTable = $(document.createElement('table'));\n\t\t\t\n\t\t\tvar prevDiv = $(document.createElement('th'));\n\t\t\tprevDiv.addClass('prev');\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {\n\t\t\t\tprevDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\tvar prevIcon = $(document.createElement('span'));\n\t\t\tprevIcon.addClass('oi oi-chevron-left');\n\t\t\t\n\t\t\tprevDiv.append(prevIcon);\n\t\t\t\n\t\t\theaderTable.append(prevDiv);\n\t\t\t\n\t\t\tvar prev2YearDiv = $(document.createElement('th'));\n\t\t\tprev2YearDiv.addClass('year-title year-neighbor2 d-none d-md-table-cell');\n\t\t\tprev2YearDiv.text(this.options.startYear - 2);\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 2, 11, 31)) {\n\t\t\t\tprev2YearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(prev2YearDiv);\n\t\t\t\n\t\t\tvar prevYearDiv = $(document.createElement('th'));\n\t\t\tprevYearDiv.addClass('year-title year-neighbor d-none d-sm-table-cell');\n\t\t\tprevYearDiv.text(this.options.startYear - 1);\n\t\t\t\n\t\t\tif(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {\n\t\t\t\tprevYearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(prevYearDiv);\n\t\t\t\n\t\t\tvar yearDiv = $(document.createElement('th'));\n\t\t\tyearDiv.addClass('year-title');\n\t\t\tyearDiv.text(this.options.startYear);\n\t\t\t\n\t\t\theaderTable.append(yearDiv);\n\t\t\t\n\t\t\tvar nextYearDiv = $(document.createElement('th'));\n\t\t\tnextYearDiv.addClass('year-title year-neighbor d-none d-sm-table-cell');\n\t\t\tnextYearDiv.text(this.options.startYear + 1);\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {\n\t\t\t\tnextYearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(nextYearDiv);\n\t\t\t\n\t\t\tvar next2YearDiv = $(document.createElement('th'));\n\t\t\tnext2YearDiv.addClass('year-title year-neighbor2 d-none d-md-table-cell');\n\t\t\tnext2YearDiv.text(this.options.startYear + 2);\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 2, 0, 1)) {\n\t\t\t\tnext2YearDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\theaderTable.append(next2YearDiv);\n\t\t\t\n\t\t\tvar nextDiv = $(document.createElement('th'));\n\t\t\tnextDiv.addClass('next');\n\t\t\t\n\t\t\tif(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {\n\t\t\t\tnextDiv.addClass('disabled');\n\t\t\t}\n\t\t\t\n\t\t\tvar nextIcon = $(document.createElement('span'));\n\t\t\tnextIcon.addClass('oi oi-chevron-right');\n\t\t\t\n\t\t\tnextDiv.append(nextIcon);\n\t\t\t\n\t\t\theaderTable.append(nextDiv);\n\t\t\t\n\t\t\theaderBody.append(headerTable);\n\n\t\t\theader.append(headerBody);\n\t\t\t\n\t\t\tthis.element.append(header);\n\t\t},\n\t\t_renderBody: function() {\n\t\t\tvar monthsDiv = $(document.createElement('div'));\n\t\t\tmonthsDiv.addClass('months-container');\n\n\t\t\tvar bsRow = $(document.createElement('div'));\n\t\t\tbsRow.addClass('row m-0');\n\n\t\t\tmonthsDiv.append(bsRow);\n\t\t\t\n\t\t\tfor(var m = 0; m < 12; m++) {\n\t\t\t\t/* Container */\n\t\t\t\tvar monthDiv = $(document.createElement('div'));\n\t\t\t\tmonthDiv.addClass('month-container');\n\t\t\t\tmonthDiv.data('month-id', m);\n\t\t\t\t\n\t\t\t\tvar firstDate = new Date(this.options.startYear, m, 1);\n\t\t\t\t\n\t\t\t\tvar table = $(document.createElement('table'));\n\t\t\t\ttable.addClass('month');\n\t\t\t\t\n\t\t\t\t/* Month header */\n\t\t\t\tvar thead = $(document.createElement('thead'));\n\t\t\t\t\n\t\t\t\tvar titleRow = $(document.createElement('tr'));\n\t\t\t\t\n\t\t\t\tvar titleCell = $(document.createElement('th'));\n\t\t\t\ttitleCell.addClass('month-title');\n\t\t\t\ttitleCell.attr('colspan', this.options.displayWeekNumber ? 8 : 7);\n\t\t\t\ttitleCell.text(dates[this.options.language].months[m]);\n\t\t\t\t\n\t\t\t\ttitleRow.append(titleCell);\n\t\t\t\tthead.append(titleRow);\n\t\t\t\t\n\t\t\t\tvar headerRow = $(document.createElement('tr'));\n\t\t\t\t\n\t\t\t\tif(this.options.displayWeekNumber) {\n\t\t\t\t\tvar weekNumberCell = $(document.createElement('th'));\n\t\t\t\t\tweekNumberCell.addClass('week-number');\n\t\t\t\t\tweekNumberCell.text(dates[this.options.language].weekShort);\n\t\t\t\t\theaderRow.append(weekNumberCell);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar weekStart = this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;\n\t\t\t\tvar d = weekStart;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tvar headerCell = $(document.createElement('th'));\n\t\t\t\t\theaderCell.addClass('day-header');\n\t\t\t\t\theaderCell.text(dates[this.options.language].daysMin[d]);\n\t\t\t\t\t\n\t\t\t\t\tif(this._isHidden(d)) {\n\t\t\t\t\t\theaderCell.addClass('hidden');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\theaderRow.append(headerCell);\n\t\t\t\t\t\n\t\t\t\t\td++;\n\t\t\t\t\tif(d >= 7)\n\t\t\t\t\t\td = 0;\n\t\t\t\t}\n\t\t\t\twhile(d != weekStart)\n\t\t\t\t\n\t\t\t\tthead.append(headerRow);\n\t\t\t\ttable.append(thead);\n\t\t\t\t\n\t\t\t\t/* Days */\n\t\t\t\tvar currentDate = new Date(firstDate.getTime());\n\t\t\t\tvar lastDate = new Date(this.options.startYear, m + 1, 0);\n\t\t\t\t\n\t\t\t\twhile(currentDate.getDay() != weekStart)\n\t\t\t\t{\n\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() - 1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twhile(currentDate <= lastDate)\n\t\t\t\t{\n\t\t\t\t\tvar row = $(document.createElement('tr'));\n\t\t\t\t\t\n\t\t\t\t\tif(this.options.displayWeekNumber) {\n\t\t\t\t\t\tvar weekNumberCell = $(document.createElement('td'));\n\t\t\t\t\t\tweekNumberCell.addClass('week-number');\n\t\t\t\t\t\tweekNumberCell.text(this.getWeekNumber(currentDate));\n\t\t\t\t\t\trow.append(weekNumberCell);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\tvar cell = $(document.createElement('td'));\n\t\t\t\t\t\tcell.addClass('day');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this._isHidden(currentDate.getDay())) {\n\t\t\t\t\t\t\tcell.addClass('hidden');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(currentDate < firstDate) {\n\t\t\t\t\t\t\tcell.addClass('old');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(currentDate > lastDate) {\n\t\t\t\t\t\t\tcell.addClass('new');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif(this._isDisabled(currentDate)) {\n\t\t\t\t\t\t\t\tcell.addClass('disabled');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar cellContent = $(document.createElement('div'));\n\t\t\t\t\t\t\tcellContent.addClass('day-content');\n\t\t\t\t\t\t\tcellContent.text(currentDate.getDate());\n\t\t\t\t\t\t\tcell.append(cellContent);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(this.options.customDayRenderer) {\n\t\t\t\t\t\t\t\tthis.options.customDayRenderer(cellContent, currentDate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\trow.append(cell);\n\t\t\t\t\t\t\n\t\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t\t\t\t\t}\n\t\t\t\t\twhile(currentDate.getDay() != weekStart)\n\t\t\t\t\t\n\t\t\t\t\ttable.append(row);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmonthDiv.append(table);\n\t\t\t\t\n\t\t\t\tbsRow.append(monthDiv);\n\t\t\t}\n\t\t\t\n\t\t\tthis.element.append(monthsDiv);\n\t\t},\n\t\t_renderDataSource: function() {\n\t\t\tvar _this = this;\n\t\t\tif(this.options.dataSource != null && this.options.dataSource.length > 0) {\n\t\t\t\tthis.element.find('.month-container').each(function() {\n\t\t\t\t\tvar month = $(this).data('month-id');\n\t\t\t\t\t\n\t\t\t\t\tvar firstDate = new Date(_this.options.startYear, month, 1);\n\t\t\t\t\tvar lastDate = new Date(_this.options.startYear, month + 1, 1);\n\t\t\t\t\t\n\t\t\t\t\tif((_this.options.minDate == null || lastDate > _this.options.minDate) && (_this.options.maxDate == null || firstDate <= _this.options.maxDate))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar monthData = [];\n\t\t\t\t\t\n\t\t\t\t\t\tfor(var i = 0; i < _this.options.dataSource.length; i++) {\n\t\t\t\t\t\t\tif(!(_this.options.dataSource[i].startDate >= lastDate) || (_this.options.dataSource[i].endDate < firstDate)) {\n\t\t\t\t\t\t\t\tmonthData.push(_this.options.dataSource[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(monthData.length > 0) {\n\t\t\t\t\t\t\t$(this).find('.day-content').each(function() {\n\t\t\t\t\t\t\t\tvar currentDate = new Date(_this.options.startYear, month, $(this).text());\n\t\t\t\t\t\t\t\tvar nextDate = new Date(_this.options.startYear, month, currentDate.getDate() + 1);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar dayData = [];\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif((_this.options.minDate == null || currentDate >= _this.options.minDate) && (_this.options.maxDate == null || currentDate <= _this.options.maxDate))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfor(var i = 0; i < monthData.length; i++) {\n\t\t\t\t\t\t\t\t\t\tif(monthData[i].startDate < nextDate && monthData[i].endDate >= currentDate) {\n\t\t\t\t\t\t\t\t\t\t\tdayData.push(monthData[i]);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif(dayData.length > 0 && (_this.options.displayDisabledDataSource || !_this._isDisabled(currentDate)))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t_this._renderDataSourceDay($(this), currentDate, dayData);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_renderDataSourceDay: function(elt, currentDate, events) {\n\t\t\tswitch(this.options.style)\n\t\t\t{\n\t\t\t\tcase 'border':\n\t\t\t\t\tvar weight = 0;\n\t\t\t\n\t\t\t\t\tif(events.length == 1) {\n\t\t\t\t\t\tweight = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(events.length <= 3) {\n\t\t\t\t\t\tweight = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\telt.parent().css('box-shadow', 'inset 0 -4px 0 0 black');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(weight > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar boxShadow = '';\n\t\t\t\t\t\n\t\t\t\t\t\tfor (var i = 0; i < events.length; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(boxShadow != '') {\n\t\t\t\t\t\t\t\tboxShadow += \",\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tboxShadow += 'inset 0 -' + (parseInt(i) + 1) * weight + 'px 0 0 ' + events[i].color;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\telt.parent().css('box-shadow', boxShadow);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\n\t\t\t\tcase 'background':\n\t\t\t\t\telt.parent().css('background-color', events[events.length - 1].color);\n\t\t\t\t\t\n\t\t\t\t\tvar currentTime = currentDate.getTime();\n\t\t\t\t\t\n\t\t\t\t\tif(events[events.length - 1].startDate.getTime() == currentTime)\n\t\t\t\t\t{\n\t\t\t\t\t\telt.parent().addClass('day-start');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(events[events.length - 1].startHalfDay || this.options.alwaysHalfDay) {\n\t\t\t\t\t\t\telt.parent().addClass('day-half');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Find color for other half\n\t\t\t\t\t\t\tvar otherColor = 'transparent';\n\t\t\t\t\t\t\tfor(var i = events.length - 2; i >= 0; i--) {\n\t\t\t\t\t\t\t\tif(events[i].startDate.getTime() != currentTime || (!events[i].startHalfDay && !this.options.alwaysHalfDay)) {\n\t\t\t\t\t\t\t\t\totherColor = events[i].color;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telt.parent().css('background', 'linear-gradient(-45deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.options.roundRangeLimits) {\n\t\t\t\t\t\t\telt.parent().addClass('round-left');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(events[events.length - 1].endDate.getTime() == currentTime)\n\t\t\t\t\t{\n\t\t\t\t\t\telt.parent().addClass('day-end');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(events[events.length - 1].endHalfDay || this.options.alwaysHalfDay) {\n\t\t\t\t\t\t\telt.parent().addClass('day-half');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Find color for other half\n\t\t\t\t\t\t\tvar otherColor = 'transparent';\n\t\t\t\t\t\t\tfor(var i = events.length - 2; i >= 0; i--) {\n\t\t\t\t\t\t\t\tif(events[i].endDate.getTime() != currentTime || (!events[i].endHalfDay && !this.options.alwaysHalfDay)) {\n\t\t\t\t\t\t\t\t\totherColor = events[i].color;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telt.parent().css('background', 'linear-gradient(135deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.options.roundRangeLimits) {\n\t\t\t\t\t\t\telt.parent().addClass('round-right');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'custom':\n\t\t\t\t\tif(this.options.customDataSourceRenderer) {\n\t\t\t\t\t\tthis.options.customDataSourceRenderer.call(this, elt, currentDate, events);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t_applyEvents: function () {\n\t\t\tvar _this = this;\n\t\t\t\n\t\t\t/* Header buttons */\n\t\t\tthis.element.find('.year-neighbor, .year-neighbor2').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.setYear(parseInt($(this).text()));\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.element.find('.calendar-header .prev').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.element.find('.months-container').animate({'margin-left':'100%'},100, function() {\n\t\t\t\t\t\t_this.element.find('.months-container').css('visibility', 'hidden');\n\t\t\t\t\t\t_this.element.find('.months-container').css('margin-left', '0');\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetTimeout(function() { \n\t\t\t\t\t\t\t_this.setYear(_this.options.startYear - 1);\n\t\t\t\t\t\t}, 50);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.element.find('.calendar-header .next').click(function() {\n\t\t\t\tif(!$(this).hasClass('disabled')) {\n\t\t\t\t\t_this.element.find('.months-container').animate({'margin-left':'-100%'},100, function() {\n\t\t\t\t\t\t_this.element.find('.months-container').css('visibility', 'hidden');\n\t\t\t\t\t\t_this.element.find('.months-container').css('margin-left', '0');\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetTimeout(function() { \n\t\t\t\t\t\t\t_this.setYear(_this.options.startYear + 1);\n\t\t\t\t\t\t}, 50);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tvar cells = this.element.find('.day:not(.old, .new, .disabled)');\n\t\t\t\n\t\t\t/* Click on date */\n\t\t\tcells.click(function(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('clickDay', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\twhich: e.which,\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Click right on date */\n\t\t\t\n\t\t\tcells.bind('contextmenu', function(e) {\n\t\t\t\tif(_this.options.enableContextMenu)\n\t\t\t\t{\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif(_this.options.contextMenuItems.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_this._openContextMenu($(this));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('dayContextMenu', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Range selection */\n\t\t\tif(this.options.enableRangeSelection) {\n\t\t\t\tcells.mousedown(function (e) {\n\t\t\t\t\tif(e.which == 1) {\n\t\t\t\t\t\tvar currentDate = _this._getDate($(this));\n\t\t\t\t\t\n\t\t\t\t\t\tif(_this.options.allowOverlap || _this.getEvents(currentDate).length == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_this._mouseDown = true;\n\t\t\t\t\t\t\t_this._rangeStart = _this._rangeEnd = currentDate;\n\t\t\t\t\t\t\t_this._refreshRange();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tcells.mouseenter(function (e) {\n\t\t\t\t\tif (_this._mouseDown) {\n\t\t\t\t\t\tvar currentDate = _this._getDate($(this));\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(!_this.options.allowOverlap)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar newDate = new Date(_this._rangeStart.getTime());\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(newDate < currentDate) {\n\t\t\t\t\t\t\t\tvar nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() + 1);\n\t\t\t\t\t\t\t\twhile(newDate < currentDate) {\n\t\t\t\t\t\t\t\t\tif(_this.getEvents(nextDate).length > 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tnewDate.setDate(newDate.getDate() + 1);\n\t\t\t\t\t\t\t\t\tnextDate.setDate(nextDate.getDate() + 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() - 1);\n\t\t\t\t\t\t\t\twhile(newDate > currentDate) {\n\t\t\t\t\t\t\t\t\tif(_this.getEvents(nextDate).length > 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tnewDate.setDate(newDate.getDate() - 1);\n\t\t\t\t\t\t\t\t\tnextDate.setDate(nextDate.getDate() - 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcurrentDate = newDate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\tvar oldValue = _this._rangeEnd;\n\t\t\t\t\t\t_this._rangeEnd = currentDate;\n\n\t\t\t\t\t\tif (oldValue.getTime() != _this._rangeEnd.getTime()) {\n\t\t\t\t\t\t\t_this._refreshRange();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t$(window).mouseup(function (e) {\n\t\t\t\t\tif (_this._mouseDown) {\n\t\t\t\t\t\t_this._mouseDown = false;\n\t\t\t\t\t\t_this._refreshRange();\n\n\t\t\t\t\t\tvar minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;\n\t\t\t\t\t\tvar maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;\n\n\t\t\t\t\t\t_this._triggerEvent('selectRange', { \n\t\t\t\t\t\t\tstartDate: minDate, \n\t\t\t\t\t\t\tendDate: maxDate,\n\t\t\t\t\t\t\tevents: _this.getEventsOnRange(minDate, new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate() + 1))\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\n\t\t\t/* Hover date */\n\t\t\tcells.mouseenter(function(e) {\n\t\t\t\tif(!_this._mouseDown)\n\t\t\t\t{\n\t\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t\t_this._triggerEvent('mouseOnDay', {\n\t\t\t\t\t\telement: $(this),\n\t\t\t\t\t\tdate: date,\n\t\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tcells.mouseleave(function(e) {\n\t\t\t\tvar date = _this._getDate($(this));\n\t\t\t\t_this._triggerEvent('mouseOutDay', {\n\t\t\t\t\telement: $(this),\n\t\t\t\t\tdate: date,\n\t\t\t\t\tevents: _this.getEvents(date)\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t/* Responsive management */\n\t\t\t\n\t\t\tsetInterval(function() {\n\t\t\t\tvar calendarSize = $(_this.element).width();\n\t\t\t\tvar monthSize = $(_this.element).find('.month').first().width() + 10;\n\t\t\t\tvar monthContainerClass = 'month-container';\n\t\t\t\t\n\t\t\t\tif(monthSize * 6 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-2';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 4 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-3';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 3 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-4';\n\t\t\t\t}\n\t\t\t\telse if(monthSize * 2 < calendarSize) {\n\t\t\t\t\tmonthContainerClass += ' col-6';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmonthContainerClass += ' col-12';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$(_this.element).find('.month-container').attr('class', monthContainerClass);\n\t\t\t}, 300);\n\t\t},\n\t\t_refreshRange: function () {\n\t\t\tvar _this = this;\n\t\t\n this.element.find('td.day.range').removeClass('range')\n this.element.find('td.day.range-start').removeClass('range-start');\n this.element.find('td.day.range-end').removeClass('range-end');\n\n if (this._mouseDown) {\n var beforeRange = true;\n var afterRange = false;\n var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;\n var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;\n\n this.element.find('.month-container').each(function () {\n\t\t\t\t\tvar monthId = $(this).data('month-id');\n if (minDate.getMonth() <= monthId && maxDate.getMonth() >= monthId) {\n $(this).find('td.day:not(.old, .new)').each(function () {\n var date = _this._getDate($(this));\n if (date >= minDate && date <= maxDate) {\n $(this).addClass('range');\n\n if (date.getTime() == minDate.getTime()) {\n $(this).addClass('range-start');\n }\n\n if (date.getTime() == maxDate.getTime()) {\n $(this).addClass('range-end');\n }\n }\n });\n }\n });\n }\n },\n\t\t_openContextMenu: function(elt) {\n\t\t\tvar contextMenu = $('.calendar-context-menu');\n\t\t\t\n\t\t\tif(contextMenu.length > 0) {\n\t\t\t\tcontextMenu.hide();\n\t\t\t\tcontextMenu.empty();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcontextMenu = $(document.createElement('div'));\n\t\t\t\tcontextMenu.addClass('calendar-context-menu');\n\t\t\t\t$('body').append(contextMenu);\n\t\t\t}\n\t\t\t\n\t\t\tvar date = this._getDate(elt);\n\t\t\tvar events = this.getEvents(date);\n\t\t\t\n\t\t\tfor(var i = 0; i < events.length; i++) {\n\t\t\t\tvar eventItem = $(document.createElement('div'));\n\t\t\t\teventItem.addClass('item');\n\t\t\t\teventItem.css('border-left', '4px solid ' + events[i].color);\n\t\t\t\t\n\t\t\t\tvar eventItemContent = $(document.createElement('div'));\n\t\t\t\teventItemContent.addClass('content');\n\t\t\t\teventItemContent.text(events[i].name);\n\t\t\t\t\n\t\t\t\teventItem.append(eventItemContent);\n\t\t\t\t\n\t\t\t\tvar icon = $(document.createElement('span'));\n\t\t\t\ticon.addClass('oi oi-chevron-right');\n\t\t\t\t\n\t\t\t\teventItem.append(icon);\n\t\t\t\t\n\t\t\t\tthis._renderContextMenuItems(eventItem, this.options.contextMenuItems, events[i]);\n\t\t\t\t\n\t\t\t\tcontextMenu.append(eventItem);\n\t\t\t}\n\t\t\t\n\t\t\tif(contextMenu.children().length > 0)\n\t\t\t{\n\t\t\t\tcontextMenu.css('left', elt.offset().left + 25 + 'px');\n\t\t\t\tcontextMenu.css('top', elt.offset().top + 25 + 'px');\n\t\t\t\tcontextMenu.show();\n\t\t\t\t\n\t\t\t\t$(window).one('mouseup', function() {\n\t\t\t\t\tcontextMenu.hide();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_renderContextMenuItems: function(parent, items, evt) {\n\t\t\tvar subMenu = $(document.createElement('div'));\n\t\t\tsubMenu.addClass('submenu');\n\t\t\t\n\t\t\tfor(var i = 0; i < items.length; i++) {\n\t\t\t\tif(!items[i].visible || items[i].visible(evt)) {\n\t\t\t\t\tvar menuItem = $(document.createElement('div'));\n\t\t\t\t\tmenuItem.addClass('item');\n\t\t\t\t\t\n\t\t\t\t\tvar menuItemContent = $(document.createElement('div'));\n\t\t\t\t\tmenuItemContent.addClass('content');\n\t\t\t\t\tmenuItemContent.text(items[i].text);\n\t\t\t\t\t\n\t\t\t\t\tmenuItem.append(menuItemContent);\n\t\t\t\t\t\n\t\t\t\t\tif(items[i].click) {\n\t\t\t\t\t\t(function(index) {\n\t\t\t\t\t\t\tmenuItem.click(function() {\n\t\t\t\t\t\t\t\titems[index].click(evt);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})(i);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar icon = $(document.createElement('span'));\n\t\t\t\t\ticon.addClass('oi oi-chevron-right');\n\t\t\t\t\t\n\t\t\t\t\tmenuItem.append(icon);\n\t\t\t\t\t\n\t\t\t\t\tif(items[i].items && items[i].items.length > 0) {\n\t\t\t\t\t\tthis._renderContextMenuItems(menuItem, items[i].items, evt);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tsubMenu.append(menuItem);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(subMenu.children().length > 0)\n\t\t\t{\n\t\t\t\tparent.append(subMenu);\n\t\t\t}\n\t\t},\n\t\t_getColor: function(colorString) {\n\t\t\tvar div = $('
');\n\t\t\tdiv.css('color', colorString);\n\t\t\t\n\t\t},\n\t\t_getDate: function(elt) {\n\t\t\tvar day = elt.children('.day-content').text();\n\t\t\tvar month = elt.closest('.month-container').data('month-id');\n\t\t\tvar year = this.options.startYear;\n\n\t\t\treturn new Date(year, month, day);\n\t\t},\n\t\t_triggerEvent: function(eventName, parameters) {\n\t\t\tvar event = $.Event(eventName);\n\t\t\t\n\t\t\tfor(var i in parameters) {\n\t\t\t\tevent[i] = parameters[i];\n\t\t\t}\n\t\t\t\n\t\t\tthis.element.trigger(event);\n\t\t\t\n\t\t\treturn event;\n\t\t},\n\t\t_isDisabled: function(date) {\n\t\t\tif((this.options.minDate != null && date < this.options.minDate) || (this.options.maxDate != null && date > this.options.maxDate))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.options.disabledWeekDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.disabledWeekDays.length; d++){\n\t\t\t\t\tif(date.getDay() == this.options.disabledWeekDays[d]) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(this.options.disabledDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.disabledDays.length; d++){\n\t\t\t\t\tif(date.getTime() == this.options.disabledDays[d].getTime()) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\t_isHidden: function(day) {\n\t\t\tif(this.options.hiddenWeekDays.length > 0) {\n\t\t\t\tfor(var d = 0; d < this.options.hiddenWeekDays.length; d++) {\n\t\t\t\t\tif(day == this.options.hiddenWeekDays[d]) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\tgetWeekNumber: function(date) {\n\t\t\tvar tempDate = new Date(date.getTime());\n\t\t\ttempDate.setHours(0, 0, 0, 0);\n\t\t\ttempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7);\n\t\t\tvar week1 = new Date(tempDate.getFullYear(), 0, 4);\n\t\t\treturn 1 + Math.round(((tempDate.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);\n\t\t},\n\t\tgetEvents: function(date) {\n\t\t\treturn this.getEventsOnRange(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1));\n\t\t},\n\t\tgetEventsOnRange: function(startDate, endDate) {\n\t\t\tvar events = [];\n\t\t\t\n\t\t\tif(this.options.dataSource && startDate && endDate) {\n\t\t\t\tfor(var i = 0; i < this.options.dataSource.length; i++) {\n\t\t\t\t\tif(this.options.dataSource[i].startDate < endDate && this.options.dataSource[i].endDate >= startDate) {\n\t\t\t\t\t\tevents.push(this.options.dataSource[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn events;\n\t\t},\n\t\tgetYear: function() {\n\t\t\treturn this.options.startYear;\n\t\t},\n\t\tsetYear: function(year) {\n\t\t\tvar parsedYear = parseInt(year);\n\t\t\tif(!isNaN(parsedYear)) {\n\t\t\t\tthis.options.startYear = parsedYear;\n\t\t\t\t\t\t\t\t\n\t\t\t\tthis.element.empty();\n\t\t\t\n\t\t\t\tif(this.options.displayHeader) {\n\t\t\t\t\tthis._renderHeader();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar eventResult = this._triggerEvent('yearChanged', { currentYear: this.options.startYear, preventRendering: false });\n\t\t\t\t\n\t\t\t\tif(!eventResult.preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetMinDate: function() {\n\t\t\treturn this.options.minDate;\n\t\t},\n\t\tsetMinDate: function(date, preventRendering) {\n\t\t\tif(date instanceof Date) {\n\t\t\t\tthis.options.minDate = date;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetMaxDate: function() {\n\t\t\treturn this.options.maxDate;\n\t\t},\n\t\tsetMaxDate: function(date, preventRendering) {\n\t\t\tif(date instanceof Date) {\n\t\t\t\tthis.options.maxDate = date;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetStyle: function() {\n\t\t\treturn this.options.style;\n\t\t},\n\t\tsetStyle: function(style, preventRendering) {\n\t\t\tthis.options.style = style == 'background' || style == 'border' || style == 'custom' ? style : 'border';\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetAllowOverlap: function() {\n\t\t\treturn this.options.allowOverlap;\n\t\t},\n\t\tsetAllowOverlap: function(allowOverlap) {\n\t\t\tthis.options.allowOverlap = allowOverlap;\n\t\t},\n\t\tgetDisplayWeekNumber: function() {\n\t\t\treturn this.options.displayWeekNumber;\n\t\t},\n\t\tsetDisplayWeekNumber: function(displayWeekNumber, preventRendering) {\n\t\t\tthis.options.displayWeekNumber = displayWeekNumber;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisplayHeader: function() {\n\t\t\treturn this.options.displayHeader;\n\t\t},\n\t\tsetDisplayHeader: function(displayHeader, preventRendering) {\n\t\t\tthis.options.displayHeader = displayHeader;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisplayDisabledDataSource: function() {\n\t\t\treturn this.options.displayDisabledDataSource;\n\t\t},\n\t\tsetDisplayDisabledDataSource: function(displayDisabledDataSource, preventRendering) {\n\t\t\tthis.options.displayDisabledDataSource = displayDisabledDataSource;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetAlwaysHalfDay: function() {\n\t\t\treturn this.options.alwaysHalfDay;\n\t\t},\n\t\tsetAlwaysHalfDay: function(alwaysHalfDay, preventRendering) {\n\t\t\tthis.options.alwaysHalfDay = alwaysHalfDay;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetEnableRangeSelection: function() {\n\t\t\treturn this.options.enableRangeSelection;\n\t\t},\n\t\tsetEnableRangeSelection: function(enableRangeSelection, preventRendering) {\n\t\t\tthis.options.enableRangeSelection = enableRangeSelection;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisabledDays: function() {\n\t\t\treturn this.options.disabledDays;\n\t\t},\n\t\tsetDisabledDays: function(disabledDays, preventRendering) {\n\t\t\tthis.options.disabledDays = disabledDays instanceof Array ? disabledDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetDisabledWeekDays: function() {\n\t\t\treturn this.options.disabledWeekDays;\n\t\t},\n\t\tsetDisabledWeekDays: function(disabledWeekDays, preventRendering) {\n\t\t\tthis.options.disabledWeekDays = disabledWeekDays instanceof Array ? disabledWeekDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetHiddenWeekDays: function() {\n\t\t\treturn this.options.hiddenWeekDays;\n\t\t},\n\t\tsetHiddenWeekDays: function(hiddenWeekDays, preventRendering) {\n\t\t\tthis.options.hiddenWeekDays = hiddenWeekDays instanceof Array ? hiddenWeekDays : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetRoundRangeLimits: function() {\n\t\t\treturn this.options.roundRangeLimits;\n\t\t},\n\t\tsetRoundRangeLimits: function(roundRangeLimits, preventRendering) {\n\t\t\tthis.options.roundRangeLimits = roundRangeLimits;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetEnableContextMenu: function() {\n\t\t\treturn this.options.enableContextMenu;\n\t\t},\n\t\tsetEnableContextMenu: function(enableContextMenu, preventRendering) {\n\t\t\tthis.options.enableContextMenu = enableContextMenu;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetContextMenuItems: function() {\n\t\t\treturn this.options.contextMenuItems;\n\t\t},\n\t\tsetContextMenuItems: function(contextMenuItems, preventRendering) {\n\t\t\tthis.options.contextMenuItems = contextMenuItems instanceof Array ? contextMenuItems : [];\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetCustomDayRenderer: function() {\n\t\t\treturn this.options.customDayRenderer;\n\t\t},\n\t\tsetCustomDayRenderer: function(customDayRenderer, preventRendering) {\n\t\t\tthis.options.customDayRenderer = $.isFunction(customDayRenderer) ? customDayRenderer : null;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetCustomDataSourceRenderer: function() {\n\t\t\treturn this.options.customDataSourceRenderer;\n\t\t},\n\t\tsetCustomDataSourceRenderer: function(customDataSourceRenderer, preventRendering) {\n\t\t\tthis.options.customDataSourceRenderer = $.isFunction(customDataSourceRenderer) ? customDataSourceRenderer : null;\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetLanguage: function() {\n\t\t\treturn this.options.language;\n\t\t},\n\t\tsetLanguage: function(language, preventRendering) {\n\t\t\tif(language != null && dates[language] != null) {\n\t\t\t\tthis.options.language = language;\n\t\t\t\t\n\t\t\t\tif(!preventRendering) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetDataSource: function() {\n\t\t\treturn this.options.dataSource;\n\t\t},\n\t\tsetDataSource: function(dataSource, preventRendering) {\n\t\t\tthis.options.dataSource = dataSource instanceof Array ? dataSource : [];\n\t\t\tthis._initializeDatasourceColors();\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\tgetWeekStart: function() {\n\t\t\treturn this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;\n\t\t},\n\t\tsetWeekStart: function(weekStart, preventRendering) {\n\t\t\tthis.options.weekStart = !isNaN(parseInt(weekStart)) ? parseInt(weekStart) : null;\n\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\t\taddEvent: function(evt, preventRendering) {\n\t\t\tthis.options.dataSource.push(evt);\n\t\t\t\n\t\t\tif(!preventRendering) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t}\n\t}\n \n\t$.fn.calendar = function (options) {\n\t\tvar calendar = new Calendar($(this) ,options);\n\t\t$(this).data('calendar', calendar);\n\t\treturn calendar;\n\t}\n\t\n\t/* Events binding management */\n\t$.fn.yearChanged = function(fct) { $(this).bind('yearChanged', fct); }\n\t$.fn.renderEnd = function(fct) { $(this).bind('renderEnd', fct); }\n\t$.fn.clickDay = function(fct) { $(this).bind('clickDay', fct); }\n\t$.fn.dayContextMenu = function(fct) { $(this).bind('dayContextMenu', fct); }\n\t$.fn.selectRange = function(fct) { $(this).bind('selectRange', fct); }\n\t$.fn.mouseOnDay = function(fct) { $(this).bind('mouseOnDay', fct); }\n\t$.fn.mouseOutDay = function(fct) { $(this).bind('mouseOutDay', fct); }\n\t\n\tvar dates = $.fn.calendar.dates = {\n\t\ten: {\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tweekShort: 'W',\n\t\t\tweekStart:0\n\t\t}\n\t};\n\t\n\tvar colors = $.fn.calendar.colors = ['#2C8FC9', '#9CB703', '#F5BB00', '#FF4A32', '#B56CE2', '#45A597'];\n\t\n\t$(function(){\n\t\t$('[data-provide=\"calendar\"]').each(function() {\n\t\t\t$(this).calendar();\n\t\t});\n\t});\n }(window.jQuery));","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","export var name = \"d3\";\nexport var version = \"5.7.0\";\nexport var description = \"Data-Driven Documents\";\nexport var keywords = [\"dom\",\"visualization\",\"svg\",\"animation\",\"canvas\"];\nexport var homepage = \"https://d3js.org\";\nexport var license = \"BSD-3-Clause\";\nexport var author = {\"name\":\"Mike Bostock\",\"url\":\"https://bost.ocks.org/mike\"};\nexport var main = \"dist/d3.node.js\";\nexport var unpkg = \"dist/d3.min.js\";\nexport var jsdelivr = \"dist/d3.min.js\";\nexport var module = \"index.js\";\nexport var repository = {\"type\":\"git\",\"url\":\"https://github.com/d3/d3.git\"};\nexport var scripts = {\"pretest\":\"rimraf dist && mkdir dist && json2module package.json > dist/package.js && node rollup.node\",\"test\":\"tape 'test/**/*-test.js'\",\"prepublishOnly\":\"yarn test && rollup -c\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\"d3 ${npm_package_version}\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\"${npm_package_version}\\\" && git tag -am \\\"${npm_package_version}\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\nexport var devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"0.64\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"1\",\"tape\":\"4\"};\nexport var dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return x;\n}\n","export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","import {slice} from \"./array\";\nimport bisect from \"./bisect\";\nimport constant from \"./constant\";\nimport extent from \"./extent\";\nimport identity from \"./identity\";\nimport range from \"./range\";\nimport {tickStep} from \"./ticks\";\nimport sturges from \"./threshold/sturges\";\n\nexport default function() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n}\n","export default function(arrays) {\n var n = arrays.length,\n m,\n i = -1,\n j = 0,\n merged,\n array;\n\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n\n return merged;\n}\n","import transpose from \"./transpose\";\n\nexport default function() {\n return transpose(arguments);\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return x;\n}\n","import {slice} from \"./array\";\nimport identity from \"./identity\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n return function(d) {\n return +scale(d);\n };\n}\n\nfunction center(scale) {\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n if (scale.round()) offset = Math.round(offset);\n return function(d) {\n return +scale(d) + offset;\n };\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + 0.5,\n range1 = +range[range.length - 1] + 0.5,\n position = (scale.bandwidth ? center : number)(scale.copy()),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient == right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d)); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = slice.call(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n}\n","import namespace from \"./namespace\";\nimport {xhtml} from \"./namespaces\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","var matcher = function(selector) {\n return function() {\n return this.matches(selector);\n };\n};\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!element.matches) {\n var vendorMatches = element.webkitMatchesSelector\n || element.msMatchesSelector\n || element.mozMatchesSelector\n || element.oMatchesSelector;\n matcher = function(selector) {\n return function() {\n return vendorMatches.call(this, selector);\n };\n };\n }\n}\n\nexport default matcher;\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","import {Selection} from \"./index\";\nimport {EnterNode} from \"./enter\";\nimport constant from \"../constant\";\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = {},\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n if (keyValue in nodeByKeyValue) {\n exit[i] = node;\n } else {\n nodeByKeyValue[keyValue] = node;\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\n if (node = nodeByKeyValue[keyValue]) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue[keyValue] = null;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n exit[i] = node;\n }\n }\n}\n\nexport default function(value, key) {\n if (!value) {\n data = new Array(this.size()), j = -1;\n this.each(function(d) { data[++j] = d; });\n return data;\n }\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = value.call(parent, parent && parent.__data__, j, parents),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import namespace from \"../namespace\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator\";\nimport selector from \"../selector\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);\n}\n\nfunction selection_cloneDeep() {\n return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","var filterEvents = {};\n\nexport var event = null;\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!(\"onmouseenter\" in element)) {\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n }\n}\n\nfunction filterContextListener(listener, index, group) {\n listener = contextListener(listener, index, group);\n return function(event) {\n var related = event.relatedTarget;\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n listener.call(this, event);\n }\n };\n}\n\nfunction contextListener(listener, index, group) {\n return function(event1) {\n var event0 = event; // Events can be reentrant (e.g., focus).\n event = event1;\n try {\n listener.call(this, this.__data__, index, group);\n } finally {\n event = event0;\n }\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, capture) {\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n return function(d, i, group) {\n var on = this.__on, o, listener = wrap(value, i, group);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, capture);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, capture) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n if (capture == null) capture = false;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n return this;\n}\n\nexport function customEvent(event1, listener, that, args) {\n var event0 = event;\n event1.sourceEvent = event;\n event = event1;\n try {\n return listener.apply(that, args);\n } finally {\n event = event0;\n }\n}\n","import defaultView from \"../window\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select\";\nimport selection_selectAll from \"./selectAll\";\nimport selection_filter from \"./filter\";\nimport selection_data from \"./data\";\nimport selection_enter from \"./enter\";\nimport selection_exit from \"./exit\";\nimport selection_merge from \"./merge\";\nimport selection_order from \"./order\";\nimport selection_sort from \"./sort\";\nimport selection_call from \"./call\";\nimport selection_nodes from \"./nodes\";\nimport selection_node from \"./node\";\nimport selection_size from \"./size\";\nimport selection_empty from \"./empty\";\nimport selection_each from \"./each\";\nimport selection_attr from \"./attr\";\nimport selection_style from \"./style\";\nimport selection_property from \"./property\";\nimport selection_classed from \"./classed\";\nimport selection_text from \"./text\";\nimport selection_html from \"./html\";\nimport selection_raise from \"./raise\";\nimport selection_lower from \"./lower\";\nimport selection_append from \"./append\";\nimport selection_insert from \"./insert\";\nimport selection_remove from \"./remove\";\nimport selection_clone from \"./clone\";\nimport selection_datum from \"./datum\";\nimport selection_on from \"./on\";\nimport selection_dispatch from \"./dispatch\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n merge: selection_merge,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch\n};\n\nexport default selection;\n","import {Selection} from \"./index\";\nimport selector from \"../selector\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index\";\nimport selectorAll from \"../selectorAll\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index\";\nimport matcher from \"../matcher\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","import {Selection} from \"./index\";\n\nexport default function(selection) {\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n var nodes = new Array(this.size()), i = -1;\n this.each(function() { nodes[++i] = this; });\n return nodes;\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n var size = 0;\n this.each(function() { ++size; });\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","import creator from \"../creator\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n","import {dispatch} from \"d3-dispatch\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag\";\nimport noevent, {nopropagation} from \"./noevent\";\nimport constant from \"./constant\";\nimport DragEvent from \"./event\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return \"ontouchstart\" in this;\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), mouse, this, arguments);\n if (!gesture) return;\n select(event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n nodrag(event.view);\n nopropagation();\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\");\n }\n\n function mousemoved() {\n noevent();\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\");\n }\n\n function mouseupped() {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent();\n gestures.mouse(\"end\");\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = event.changedTouches,\n c = container.apply(this, arguments),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {\n nopropagation();\n gesture(\"start\");\n }\n }\n }\n\n function touchmoved() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent();\n gesture(\"drag\");\n }\n }\n }\n\n function touchended() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation();\n gesture(\"end\");\n }\n }\n }\n\n function beforestart(id, container, point, that, args) {\n var p = point(container, id), s, dx, dy,\n sublisteners = listeners.copy();\n\n if (!customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n if ((event.subject = s = subject.apply(that, args)) == null) return false;\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n return true;\n })) return;\n\n return function gesture(type) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[id] = gesture, n = active++; break;\n case \"end\": delete gestures[id], --active; // nobreak\n case \"drag\": p = point(container, id), n = active; break;\n }\n customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex3 = /^#([0-9a-f]{3})$/,\n reHex6 = /^#([0-9a-f]{6})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: function() {\n return this.rgb().hex();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nexport default function color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: function() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\n// https://beta.observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import constant from \"./constant\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis\";\nimport basisClosed from \"./basisClosed\";\nimport nogamma, {gamma} from \"./color\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n}\n","import {basis} from \"./basis\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import decompose, {identity} from \"./decompose\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb\";\nimport array from \"./array\";\nimport date from \"./date\";\nimport number from \"./number\";\nimport object from \"./object\";\nimport string from \"./string\";\nimport constant from \"./constant\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import number from \"../number\";\nimport {parseCss, parseSvg} from \"./parse\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(function(elapsed) {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTING) throw new Error(\"too late; already started\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n // Dispatch the interrupt event.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions. No interrupt event is dispatched\n // because the cancelled transitions never started. Note that this also\n // removes this transition from the pending list!\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(null, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n if (active) schedule.on.call(\"interrupt\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import {get, set} from \"./schedule\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {tweenValue} from \"./tween\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr\";\nimport transition_attrTween from \"./attrTween\";\nimport transition_delay from \"./delay\";\nimport transition_duration from \"./duration\";\nimport transition_ease from \"./ease\";\nimport transition_filter from \"./filter\";\nimport transition_merge from \"./merge\";\nimport transition_on from \"./on\";\nimport transition_remove from \"./remove\";\nimport transition_select from \"./select\";\nimport transition_selectAll from \"./selectAll\";\nimport transition_selection from \"./selection\";\nimport transition_style from \"./style\";\nimport transition_styleTween from \"./styleTween\";\nimport transition_text from \"./text\";\nimport transition_transition from \"./transition\";\nimport transition_tween from \"./tween\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {get, set, init} from \"./schedule\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttribute(name);\n value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + \"\"));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrTweenNS(fullname, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttributeNS(fullname.space, fullname.local, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttribute(name, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction styleRemove(name, interpolate) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction styleRemoveEnd(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = style(this, name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = value(this);\n if (value1 == null) value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleRemove(name, i))\n .on(\"end.style.\" + name, styleRemoveEnd(name))\n : this.styleTween(name, typeof value === \"function\"\n ? styleFunction(name, i, tweenValue(this, \"style.\" + name, value))\n : styleConstant(name, i, value + \"\"), priority);\n}\n","function styleTween(name, value, priority) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.style.setProperty(name, i(t), priority);\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {get, init} from \"./schedule\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n","var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n","var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return t * t * ((s + 1) * t - s);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((s + 1) * t + s) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n","var tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n","import {Transition, newId} from \"../transition/index\";\nimport schedule from \"../transition/schedule\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n return defaultTiming.time = now(), defaultTiming;\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt\";\nimport selection_transition from \"./transition\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {customEvent, event, mouse, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant\";\nimport BrushEvent from \"./event\";\nimport noevent, {nopropagation} from \"./noevent\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nvar X = {\n name: \"x\",\n handles: [\"e\", \"w\"].map(type),\n input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\"].map(type),\n input: function(xy) { return xy; },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n listeners = dispatch(brush, \"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\")\n .on(\"mousedown.brush touchstart.brush\", started);\n }\n\n brush.move = function(group, selection) {\n if (group.selection) {\n group\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && empty(selection1) ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 && selection1 ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 == null || empty(selection1) ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args) {\n return that.__brush.emitter || new Emitter(that, args);\n }\n\n function Emitter(that, args) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function() {\n if (this.starting) this.starting = false, this.emit(\"start\");\n return this;\n },\n brush: function() {\n this.emit(\"brush\");\n return this;\n },\n end: function() {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n return this;\n },\n emit: function(type) {\n customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function started() {\n if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent(); }\n else if (touchending) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx,\n dy,\n moving,\n shifting = signX && signY && event.shiftKey,\n lockX,\n lockY,\n point0 = mouse(that),\n point = point0,\n emit = emitter(that, arguments).beforestart();\n\n if (type === \"overlay\") {\n state.selection = selection = [\n [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n ];\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n group\n .on(\"touchmove.brush\", moved, true)\n .on(\"touchend.brush touchcancel.brush\", ended, true);\n } else {\n var view = select(event.view)\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n\n dragDisable(event.view);\n }\n\n nopropagation();\n interrupt(that);\n redraw.call(that);\n emit.start();\n\n function moved() {\n var point1 = mouse(that);\n if (shifting && !lockX && !lockY) {\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n else lockX = true;\n }\n point = point1;\n moving = true;\n noevent();\n move();\n }\n\n function move() {\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush();\n }\n }\n\n function ended() {\n nopropagation();\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n group.on(\"touchmove.brush touchend.brush touchcancel.brush\", null);\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end();\n }\n\n function keydowned() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n\n function keyupped() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = extent.apply(this, arguments);\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export var cos = Math.cos;\nexport var sin = Math.sin;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = pi * 2;\nexport var max = Math.max;\n","export var slice = Array.prototype.slice;\n","import {range} from \"d3-array\";\nimport {max, tau} from \"./math\";\n\nfunction compareValue(compare) {\n return function(a, b) {\n return compare(\n a.source.value + a.target.value,\n b.source.value + b.target.value\n );\n };\n}\n\nexport default function() {\n var padAngle = 0,\n sortGroups = null,\n sortSubgroups = null,\n sortChords = null;\n\n function chord(matrix) {\n var n = matrix.length,\n groupSums = [],\n groupIndex = range(n),\n subgroupIndex = [],\n chords = [],\n groups = chords.groups = new Array(n),\n subgroups = new Array(n * n),\n k,\n x,\n x0,\n dx,\n i,\n j;\n\n // Compute the sum.\n k = 0, i = -1; while (++i < n) {\n x = 0, j = -1; while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(range(n));\n k += x;\n }\n\n // Sort groups…\n if (sortGroups) groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n\n // Sort subgroups…\n if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n\n // Convert the sum to scaling factor for [0, 2pi].\n // TODO Allow start and end angle to be specified?\n // TODO Allow padding to be specified as percentage?\n k = max(0, tau - padAngle * n) / k;\n dx = k ? padAngle : tau / n;\n\n // Compute the start and end angle for each group and subgroup.\n // Note: Opera has a bug reordering object literal properties!\n x = 0, i = -1; while (++i < n) {\n x0 = x, j = -1; while (++j < n) {\n var di = groupIndex[i],\n dj = subgroupIndex[di][j],\n v = matrix[di][dj],\n a0 = x,\n a1 = x += v * k;\n subgroups[dj * n + di] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += dx;\n }\n\n // Generate chords for each (non-empty) subgroup-subgroup link.\n i = -1; while (++i < n) {\n j = i - 1; while (++j < n) {\n var source = subgroups[j * n + i],\n target = subgroups[i * n + j];\n if (source.value || target.value) {\n chords.push(source.value < target.value\n ? {source: target, target: source}\n : {source: source, target: target});\n }\n }\n }\n\n return sortChords ? chords.sort(sortChords) : chords;\n }\n\n chord.padAngle = function(_) {\n return arguments.length ? (padAngle = max(0, _), chord) : padAngle;\n };\n\n chord.sortGroups = function(_) {\n return arguments.length ? (sortGroups = _, chord) : sortGroups;\n };\n\n chord.sortSubgroups = function(_) {\n return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\n };\n\n chord.sortChords = function(_) {\n return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\n };\n\n return chord;\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport {cos, halfPi, sin} from \"./math\";\nimport {path} from \"d3-path\";\n\nfunction defaultSource(d) {\n return d.source;\n}\n\nfunction defaultTarget(d) {\n return d.target;\n}\n\nfunction defaultRadius(d) {\n return d.radius;\n}\n\nfunction defaultStartAngle(d) {\n return d.startAngle;\n}\n\nfunction defaultEndAngle(d) {\n return d.endAngle;\n}\n\nexport default function() {\n var source = defaultSource,\n target = defaultTarget,\n radius = defaultRadius,\n startAngle = defaultStartAngle,\n endAngle = defaultEndAngle,\n context = null;\n\n function ribbon() {\n var buffer,\n argv = slice.call(arguments),\n s = source.apply(this, argv),\n t = target.apply(this, argv),\n sr = +radius.apply(this, (argv[0] = s, argv)),\n sa0 = startAngle.apply(this, argv) - halfPi,\n sa1 = endAngle.apply(this, argv) - halfPi,\n sx0 = sr * cos(sa0),\n sy0 = sr * sin(sa0),\n tr = +radius.apply(this, (argv[0] = t, argv)),\n ta0 = startAngle.apply(this, argv) - halfPi,\n ta1 = endAngle.apply(this, argv) - halfPi;\n\n if (!context) context = buffer = path();\n\n context.moveTo(sx0, sy0);\n context.arc(0, 0, sr, sa0, sa1);\n if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\n context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\n context.arc(0, 0, tr, ta0, ta1);\n }\n context.quadraticCurveTo(0, 0, sx0, sy0);\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n ribbon.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), ribbon) : radius;\n };\n\n ribbon.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : startAngle;\n };\n\n ribbon.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : endAngle;\n };\n\n ribbon.source = function(_) {\n return arguments.length ? (source = _, ribbon) : source;\n };\n\n ribbon.target = function(_) {\n return arguments.length ? (target = _, ribbon) : target;\n };\n\n ribbon.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\n };\n\n return ribbon;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import map from \"./map\";\n\nexport default function() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map, depth) {\n if (++depth > keys.length) return map;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map.entries();\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n}\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map, key, value) {\n map.set(key, value);\n}\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","import {max, range, tickStep} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {blurX, blurY} from \"./blur\";\nimport constant from \"./constant\";\nimport contours from \"./contours\";\n\nfunction defaultX(d) {\n return d[0];\n}\n\nfunction defaultY(d) {\n return d[1];\n}\n\nfunction defaultWeight() {\n return 1;\n}\n\nexport default function() {\n var x = defaultX,\n y = defaultY,\n weight = defaultWeight,\n dx = 960,\n dy = 500,\n r = 20, // blur radius\n k = 2, // log2(grid cell size)\n o = r * 3, // grid offset, to pad for blur\n n = (dx + o * 2) >> k, // grid width\n m = (dy + o * 2) >> k, // grid height\n threshold = constant(20);\n\n function density(data) {\n var values0 = new Float32Array(n * m),\n values1 = new Float32Array(n * m);\n\n data.forEach(function(d, i, data) {\n var xi = (+x(d, i, data) + o) >> k,\n yi = (+y(d, i, data) + o) >> k,\n wi = +weight(d, i, data);\n if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\n values0[xi + yi * n] += wi;\n }\n });\n\n // TODO Optimize.\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n\n var tz = threshold(values0);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var stop = max(values0);\n tz = tickStep(0, stop, tz);\n tz = range(0, Math.floor(stop / tz) * tz, tz);\n tz.shift();\n }\n\n return contours()\n .thresholds(tz)\n .size([n, m])\n (values0)\n .map(transform);\n }\n\n function transform(geometry) {\n geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.\n geometry.coordinates.forEach(transformPolygon);\n return geometry;\n }\n\n function transformPolygon(coordinates) {\n coordinates.forEach(transformRing);\n }\n\n function transformRing(coordinates) {\n coordinates.forEach(transformPoint);\n }\n\n // TODO Optimize.\n function transformPoint(coordinates) {\n coordinates[0] = coordinates[0] * Math.pow(2, k) - o;\n coordinates[1] = coordinates[1] * Math.pow(2, k) - o;\n }\n\n function resize() {\n o = r * 3;\n n = (dx + o * 2) >> k;\n m = (dy + o * 2) >> k;\n return density;\n }\n\n density.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), density) : x;\n };\n\n density.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), density) : y;\n };\n\n density.weight = function(_) {\n return arguments.length ? (weight = typeof _ === \"function\" ? _ : constant(+_), density) : weight;\n };\n\n density.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 >= 0) && !(_0 >= 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, resize();\n };\n\n density.cellSize = function(_) {\n if (!arguments.length) return 1 << k;\n if (!((_ = +_) >= 1)) throw new Error(\"invalid cell size\");\n return k = Math.floor(Math.log(_) / Math.LN2), resize();\n };\n\n density.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold;\n };\n\n density.bandwidth = function(_) {\n if (!arguments.length) return Math.sqrt(r * (r + 1));\n if (!((_ = +_) >= 0)) throw new Error(\"invalid bandwidth\");\n return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();\n };\n\n return density;\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n })).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(text) {\n return text == null ? \"\"\n : reFormat.test(text += \"\") ? \"\\\"\" + text.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : text;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatRows: formatRows\n };\n}\n","import dsv from \"./dsv\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatRows = csv.formatRows;\n","import dsv from \"./dsv\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatRows = tsv.formatRows;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","import text from \"./text\";\n\nfunction parser(type) {\n return function(input, init) {\n return text(input, init).then(function(text) {\n return (new DOMParser).parseFromString(text, type);\n });\n };\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(d) {\n var x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, inherit the existing extent.\n if (x1 < x0) x0 = this._x0, x1 = this._x1;\n if (y1 < y0) y0 = this._y0, y1 = this._y1;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else if (x0 > x || x > x1 || y0 > y || y > y1) {\n var z = x1 - x0,\n node = this._root,\n parent,\n i;\n\n switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {\n case 0: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);\n break;\n }\n case 1: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);\n break;\n }\n case 2: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);\n break;\n }\n case 3: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);\n break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n // If the quadtree covers the point already, just return.\n else return this;\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add\";\nimport tree_cover from \"./cover\";\nimport tree_data from \"./data\";\nimport tree_extent from \"./extent\";\nimport tree_find from \"./find\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove\";\nimport tree_root from \"./root\";\nimport tree_size from \"./size\";\nimport tree_visit from \"./visit\";\nimport tree_visitAfter from \"./visitAfter\";\nimport tree_x, {defaultX} from \"./x\";\nimport tree_y, {defaultY} from \"./y\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","import Quad from \"./quad\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {map} from \"d3-collection\";\nimport {timer} from \"d3-timer\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\");\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick() {\n var i, n = nodes.length, node;\n\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.each(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n this.fill = match[1] || \" \";\n this.align = match[2] || \">\";\n this.sign = match[3] || \"-\";\n this.symbol = match[4] || \"\";\n this.zero = !!match[5];\n this.width = match[6] && +match[6];\n this.comma = !!match[7];\n this.precision = match[8] && +match[8].slice(1);\n this.trim = !!match[9];\n this.type = match[10] || \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto\";\nimport formatRounded from \"./formatRounded\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent\";\nimport formatGroup from \"./formatGroup\";\nimport formatNumerals from \"./formatNumerals\";\nimport formatSpecifier from \"./formatSpecifier\";\nimport formatTrim from \"./formatTrim\";\nimport formatTypes from \"./formatTypes\";\nimport {prefixExponent} from \"./formatPrefixAuto\";\nimport identity from \"./identity\";\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","import exponent from \"./exponent\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n return new Adder;\n}\n\nfunction Adder() {\n this.reset();\n}\n\nAdder.prototype = {\n constructor: Adder,\n reset: function() {\n this.s = // rounded value\n this.t = 0; // exact error\n },\n add: function(y) {\n add(temp, y, this.t);\n add(this, temp.s, this.s);\n if (this.s) this.t += temp.t;\n else this.s = temp.t;\n },\n valueOf: function() {\n return this.s;\n }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n var x = adder.s = a + b,\n bv = x - a,\n av = x - bv;\n adder.t = (a - av) + (b - bv);\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","import adder from \"./adder\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nexport var areaRingSum = adder();\n\nvar areaSum = adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum.reset();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli’s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum.reset();\n stream(object, areaStream);\n return areaSum * 2;\n}\n","import {asin, atan2, cos, sin, sqrt} from \"./math\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n","import adder from \"./adder\";\nimport {areaStream, areaRingSum} from \"./area\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport {abs, degrees, epsilon, radians} from \"./math\";\nimport stream from \"./stream\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum = adder(),\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum.reset();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n","import compose from \"./compose\";\nimport {asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math\";\n\nfunction rotationIdentity(lambda, phi) {\n return [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n","import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport constant from \"./constant\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math\";\nimport {rotateRadians} from \"./rotation\";\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(6),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n","import noop from \"../noop\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y) {\n line.push([x, y]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n","import {abs, epsilon} from \"./math\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import pointEqual from \"../pointEqual\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n // If the first and last points of a segment are coincident, then treat as a\n // closed ring. TODO if all rings are closed, then the winding order of the\n // exterior ring should be checked.\n if (pointEqual(p0, p1)) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n","import adder from \"./adder\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian\";\nimport {asin, atan2, cos, epsilon, halfPi, pi, quarterPi, sin, tau} from \"./math\";\n\nvar sum = adder();\n\nexport default function(polygon, point) {\n var lambda = point[0],\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n sum.reset();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = point0[0],\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = point1[0],\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point’s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1);\n}\n","import clipBuffer from \"./buffer\";\nimport clipRejoin from \"./rejoin\";\nimport {epsilon, halfPi} from \"../math\";\nimport polygonContains from \"../polygonContains\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n","import clip from \"./index\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n","import adder from \"./adder\";\nimport {abs, atan2, cos, radians, sin, sqrt} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nvar lengthSum = adder(),\n lambda0,\n sinPhi0,\n cosPhi0;\n\nvar lengthStream = {\n sphere: noop,\n point: noop,\n lineStart: lengthLineStart,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop\n};\n\nfunction lengthLineStart() {\n lengthStream.point = lengthPointFirst;\n lengthStream.lineEnd = lengthLineEnd;\n}\n\nfunction lengthLineEnd() {\n lengthStream.point = lengthStream.lineEnd = noop;\n}\n\nfunction lengthPointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);\n lengthStream.point = lengthPoint;\n}\n\nfunction lengthPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var sinPhi = sin(phi),\n cosPhi = cos(phi),\n delta = abs(lambda - lambda0),\n cosDelta = cos(delta),\n sinDelta = sin(delta),\n x = cosPhi * sinDelta,\n y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,\n z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;\n lengthSum.add(atan2(sqrt(x * x + y * y), z));\n lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;\n}\n\nexport default function(object) {\n lengthSum.reset();\n stream(object, lengthStream);\n return +lengthSum;\n}\n","import adder from \"../adder\";\nimport {abs} from \"../math\";\nimport noop from \"../noop\";\n\nvar areaSum = adder(),\n areaRingSum = adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum.reset();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum.reset();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","import adder from \"../adder\";\nimport {sqrt} from \"../math\";\nimport noop from \"../noop\";\n\nvar lengthSum = adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum.reset();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n this._string = [];\n}\n\nPathString.prototype = {\n _radius: 4.5,\n _circle: circle(4.5),\n pointRadius: function(_) {\n if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n return this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._string.push(\"Z\");\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._string.push(\"M\", x, \",\", y);\n this._point = 1;\n break;\n }\n case 1: {\n this._string.push(\"L\", x, \",\", y);\n break;\n }\n default: {\n if (this._circle == null) this._circle = circle(this._radius);\n this._string.push(\"M\", x, \",\", y, this._circle);\n break;\n }\n }\n },\n result: function() {\n if (this._string.length) {\n var result = this._string.join(\"\");\n this._string = [];\n return result;\n } else {\n return null;\n }\n }\n};\n\nfunction circle(radius) {\n return \"m0,\" + radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n + \"z\";\n}\n","export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {cartesian} from \"../cartesian\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math\";\nimport {transformer} from \"../transform\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n","import clipAntimeridian from \"../clip/antimeridian\";\nimport clipCircle from \"../clip/circle\";\nimport clipRectangle from \"../clip/rectangle\";\nimport compose from \"../compose\";\nimport identity from \"../identity\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math\";\nimport {rotateRadians} from \"../rotation\";\nimport {transformer} from \"../transform\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit\";\nimport resample from \"./resample\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy) {\n function transform(x, y) {\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k, (dy - y) / k];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, alpha) {\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [ai * x - bi * y + ci, fi - bi * x - ai * y];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),\n transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n","import {asin, atan2, cos, sin, sqrt} from \"../math\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n","import {asin, sqrt} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n return sqrt(2 / (1 + cxcy));\n});\n\nazimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n return 2 * asin(z / 2);\n});\n\nexport default function() {\n return projection(azimuthalEqualAreaRaw)\n .scale(124.75)\n .clipAngle(180 - 1e-3);\n}\n","import {acos, sin} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEquidistantRaw = azimuthalRaw(function(c) {\n return (c = acos(c)) && c / sin(c);\n});\n\nazimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n return z;\n});\n\nexport default function() {\n return projection(azimuthalEquidistantRaw)\n .scale(79.4188)\n .clipAngle(180 - 1e-3);\n}\n","import projection from \"./index\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n","import {abs, atan2, cos, epsilon, sign, sin, sqrt} from \"../math\";\nimport {conicProjection} from \"./conic\";\nimport {equirectangularRaw} from \"./equirectangular\";\n\nexport function conicEquidistantRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0),\n g = cy0 / n + y0;\n\n if (abs(n) < epsilon) return equirectangularRaw;\n\n function project(x, y) {\n var gy = g - y, nx = n * x;\n return [gy * sin(nx), g - gy * cos(nx)];\n }\n\n project.invert = function(x, y) {\n var gy = g - y;\n return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEquidistantRaw)\n .scale(131.154)\n .center([0, 13.9389]);\n}\n","import projection from \"./index.js\";\nimport {abs, asin, cos, epsilon2, sin, sqrt} from \"../math.js\";\n\nvar A1 = 1.340264,\n A2 = -0.081106,\n A3 = 0.000893,\n A4 = 0.003796,\n M = sqrt(3) / 2,\n iterations = 12;\n\nexport function equalEarthRaw(lambda, phi) {\n var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n return [\n lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n ];\n}\n\nequalEarthRaw.invert = function(x, y) {\n var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n if (abs(delta) < epsilon2) break;\n }\n return [\n M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l),\n asin(sin(l) / M)\n ];\n};\n\nexport default function() {\n return projection(equalEarthRaw)\n .scale(177.158);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function gnomonicRaw(x, y) {\n var cy = cos(y), k = cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\ngnomonicRaw.invert = azimuthalInvert(atan);\n\nexport default function() {\n return projection(gnomonicRaw)\n .scale(144.049)\n .clipAngle(60);\n}\n","import {asin, cos, epsilon, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function stereographicRaw(x, y) {\n var cy = cos(y), k = 1 + cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\nstereographicRaw.invert = azimuthalInvert(function(z) {\n return 2 * atan(z);\n});\n\nexport default function() {\n return projection(stereographicRaw)\n .scale(250)\n .clipAngle(142);\n}\n","function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n","import node_count from \"./count\";\nimport node_each from \"./each\";\nimport node_eachBefore from \"./eachBefore\";\nimport node_eachAfter from \"./eachAfter\";\nimport node_sum from \"./sum\";\nimport node_sort from \"./sort\";\nimport node_path from \"./path\";\nimport node_ancestors from \"./ancestors\";\nimport node_descendants from \"./descendants\";\nimport node_leaves from \"./leaves\";\nimport node_links from \"./links\";\n\nexport default function hierarchy(data, children) {\n var root = new Node(data),\n valued = +data.value && (root.value = data.value),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n if (children == null) children = defaultChildren;\n\n while (node = nodes.pop()) {\n if (valued) node.value = +node.data.value;\n if ((childs = children(node.data)) && (n = childs.length)) {\n node.children = new Array(n);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction defaultChildren(d) {\n return d.children;\n}\n\nfunction copyData(node) {\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy\n};\n","export default function(callback) {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n callback(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n } while (next.length);\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], next = [], children, i, n;\n while (node = nodes.pop()) {\n next.push(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n while (node = next.pop()) {\n callback(node);\n }\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], children, i;\n while (node = nodes.pop()) {\n callback(node), children = node.children;\n if (children) for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n return this;\n}\n","export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n","export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n","export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n","export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n","export default function() {\n var nodes = [];\n this.each(function(node) {\n nodes.push(node);\n });\n return nodes;\n}\n","export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n","export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don’t include the root’s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n","export var slice = Array.prototype.slice;\n\nexport function shuffle(array) {\n var m = array.length,\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m];\n array[m] = array[i];\n array[i] = t;\n }\n\n return array;\n}\n","export default function(node) {\n node.x0 = Math.round(node.x0);\n node.y0 = Math.round(node.y0);\n node.x1 = Math.round(node.x1);\n node.y1 = Math.round(node.y1);\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (x1 - x0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.y0 = y0, node.y1 = y1;\n node.x0 = x0, node.x1 = x0 += node.value * k;\n }\n}\n","import {Node} from \"./hierarchy/index\";\n\nfunction defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\n// function radialSeparation(a, b) {\n// return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n var children = v.children;\n return children ? children[0] : v.t;\n}\n\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n var children = v.children;\n return children ? children[children.length - 1] : v.t;\n}\n\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n}\n\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n var shift = 0,\n change = 0,\n children = v.children,\n i = children.length,\n w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n}\n\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n}\n\nfunction TreeNode(node, i) {\n this._ = node;\n this.parent = null;\n this.children = null;\n this.A = null; // default ancestor\n this.a = this; // ancestor\n this.z = 0; // prelim\n this.m = 0; // mod\n this.c = 0; // change\n this.s = 0; // shift\n this.t = null; // thread\n this.i = i; // number\n}\n\nTreeNode.prototype = Object.create(Node.prototype);\n\nfunction treeRoot(root) {\n var tree = new TreeNode(root, 0),\n node,\n nodes = [tree],\n child,\n children,\n i,\n n;\n\n while (node = nodes.pop()) {\n if (children = node._.children) {\n node.children = new Array(n = children.length);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n child.parent = node;\n }\n }\n }\n\n (tree.parent = new TreeNode(null, 0)).children = [tree];\n return tree;\n}\n\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = null;\n\n function tree(root) {\n var t = treeRoot(root);\n\n // Compute the layout using Buchheim et al.’s algorithm.\n t.eachAfter(firstWalk), t.parent.m = -t.z;\n t.eachBefore(secondWalk);\n\n // If a fixed node size is specified, scale x and y.\n if (nodeSize) root.eachBefore(sizeNode);\n\n // If a fixed tree size is specified, scale x and y based on the extent.\n // Compute the left-most, right-most, and depth-most nodes for extents.\n else {\n var left = root,\n right = root,\n bottom = root;\n root.eachBefore(function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var s = left === right ? 1 : separation(left, right) / 2,\n tx = s - left.x,\n kx = dx / (right.x + s + tx),\n ky = dy / (bottom.depth || 1);\n root.eachBefore(function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n\n return root;\n }\n\n // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n // applied recursively to the children of v, as well as the function\n // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n // node v is placed to the midpoint of its outermost children.\n function firstWalk(v) {\n var children = v.children,\n siblings = v.parent.children,\n w = v.i ? siblings[v.i - 1] : null;\n if (children) {\n executeShifts(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n\n // Computes all real x-coordinates by summing up the modifiers recursively.\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n\n // The core of the algorithm. Here, a new subtree is combined with the\n // previous subtrees. Threads are used to traverse the inside and outside\n // contours of the left and right subtree up to the highest common level. The\n // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n // superscript o means outside and i means inside, the subscript - means left\n // subtree and + means right subtree. For summing up the modifiers along the\n // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n // nodes of the inside contours conflict, we compute the left one of the\n // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n // Finally, we add a new thread (if necessary).\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v,\n vop = v,\n vim = w,\n vom = vip.parent.children[0],\n sip = vip.m,\n sop = vop.m,\n sim = vim.m,\n som = vom.m,\n shift;\n while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n vom = nextLeft(vom);\n vop = nextRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !nextRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !nextLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n\n function sizeNode(node) {\n node.x *= dx;\n node.y = node.depth * dy;\n }\n\n tree.separation = function(x) {\n return arguments.length ? (separation = x, tree) : separation;\n };\n\n tree.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);\n };\n\n tree.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);\n };\n\n return tree;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (y1 - y0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.x0 = x0, node.x1 = x1;\n node.y0 = y0, node.y1 = y0 += node.value * k;\n }\n}\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\n\nexport var phi = (1 + Math.sqrt(5)) / 2;\n\nexport function squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n var rows = [],\n nodes = parent.children,\n row,\n nodeValue,\n i0 = 0,\n i1 = 0,\n n = nodes.length,\n dx, dy,\n value = parent.value,\n sumValue,\n minValue,\n maxValue,\n newRatio,\n minRatio,\n alpha,\n beta;\n\n while (i0 < n) {\n dx = x1 - x0, dy = y1 - y0;\n\n // Find the next non-empty node.\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n minValue = maxValue = sumValue;\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n beta = sumValue * sumValue * alpha;\n minRatio = Math.max(maxValue / beta, beta / minValue);\n\n // Keep adding nodes while the aspect ratio maintains or improves.\n for (; i1 < n; ++i1) {\n sumValue += nodeValue = nodes[i1].value;\n if (nodeValue < minValue) minValue = nodeValue;\n if (nodeValue > maxValue) maxValue = nodeValue;\n beta = sumValue * sumValue * alpha;\n newRatio = Math.max(maxValue / beta, beta / minValue);\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\n minRatio = newRatio;\n }\n\n // Position and record the row orientation.\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\n if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n value -= sumValue, i0 = i1;\n }\n\n return rows;\n}\n\nexport default (function custom(ratio) {\n\n function squarify(parent, x0, y0, x1, y1) {\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\n }\n\n squarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return squarify;\n})(phi);\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\nimport {phi, squarifyRatio} from \"./squarify\";\n\nexport default (function custom(ratio) {\n\n function resquarify(parent, x0, y0, x1, y1) {\n if ((rows = parent._squarify) && (rows.ratio === ratio)) {\n var rows,\n row,\n nodes,\n i,\n j = -1,\n n,\n m = rows.length,\n value = parent.value;\n\n while (++j < m) {\n row = rows[j], nodes = row.children;\n for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);\n else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\n value -= row.value;\n }\n } else {\n parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);\n rows.ratio = ratio;\n }\n }\n\n resquarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return resquarify;\n})(phi);\n","import cross from \"./cross\";\n\nfunction lexicographicOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n}\n\n// Computes the upper convex hull per the monotone chain algorithm.\n// Assumes points.length >= 3, is sorted by x, unique in y.\n// Returns an array of indices into points in left-to-right order.\nfunction computeUpperHullIndexes(points) {\n var n = points.length,\n indexes = [0, 1],\n size = 2;\n\n for (var i = 2; i < n; ++i) {\n while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;\n indexes[size++] = i;\n }\n\n return indexes.slice(0, size); // remove popped points\n}\n\nexport default function(points) {\n if ((n = points.length) < 3) return null;\n\n var i,\n n,\n sortedPoints = new Array(n),\n flippedPoints = new Array(n);\n\n for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];\n sortedPoints.sort(lexicographicOrder);\n for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];\n\n var upperIndexes = computeUpperHullIndexes(sortedPoints),\n lowerIndexes = computeUpperHullIndexes(flippedPoints);\n\n // Construct the hull polygon, removing possible duplicate endpoints.\n var skipLeft = lowerIndexes[0] === upperIndexes[0],\n skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],\n hull = [];\n\n // Add upper hull in right-to-l order.\n // Then add lower hull in left-to-right order.\n for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);\n for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);\n\n return hull;\n}\n","export default function() {\n return Math.random();\n}\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomNormal(source) {\n function randomNormal(mu, sigma) {\n var x, r;\n mu = mu == null ? 0 : +mu;\n sigma = sigma == null ? 1 : +sigma;\n return function() {\n var y;\n\n // If available, use the second previously-generated uniform random.\n if (x != null) y = x, x = null;\n\n // Otherwise, generate a new x and y.\n else do {\n x = source() * 2 - 1;\n y = source() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n\n return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n };\n }\n\n randomNormal.source = sourceRandomNormal;\n\n return randomNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomUniform(source) {\n function randomUniform(min, max) {\n min = min == null ? 0 : +min;\n max = max == null ? 1 : +max;\n if (arguments.length === 1) max = min, min = 0;\n else max -= min;\n return function() {\n return source() * max + min;\n };\n }\n\n randomUniform.source = sourceRandomUniform;\n\n return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomIrwinHall(source) {\n function randomIrwinHall(n) {\n return function() {\n for (var sum = 0, i = 0; i < n; ++i) sum += source();\n return sum;\n };\n }\n\n randomIrwinHall.source = sourceRandomIrwinHall;\n\n return randomIrwinHall;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport normal from \"./normal\";\n\nexport default (function sourceRandomLogNormal(source) {\n function randomLogNormal() {\n var randomNormal = normal.source(source).apply(this, arguments);\n return function() {\n return Math.exp(randomNormal());\n };\n }\n\n randomLogNormal.source = sourceRandomLogNormal;\n\n return randomLogNormal;\n})(defaultSource);\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import defaultSource from \"./defaultSource\";\nimport irwinHall from \"./irwinHall\";\n\nexport default (function sourceRandomBates(source) {\n function randomBates(n) {\n var randomIrwinHall = irwinHall.source(source)(n);\n return function() {\n return randomIrwinHall() / n;\n };\n }\n\n randomBates.source = sourceRandomBates;\n\n return randomBates;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomExponential(source) {\n function randomExponential(lambda) {\n return function() {\n return -Math.log(1 - source()) / lambda;\n };\n }\n\n randomExponential.source = sourceRandomExponential;\n\n return randomExponential;\n})(defaultSource);\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal(range) {\n var index = map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : slice.call(range);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nexport default function continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(deinterpolate, reinterpolate);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n return linearish(scale);\n}\n","export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n","import interval from \"./interval\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval\";\nimport {durationSecond} from \"./duration\";\n\nvar second = interval(function(date) {\n date.setTime(Math.floor(date / durationSecond) * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar minute = interval(function(date) {\n date.setTime(Math.floor(date / durationMinute) * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval\";\nimport {durationHour, durationMinute} from \"./duration\";\n\nvar hour = interval(function(date) {\n var offset = date.getTimezoneOffset() * durationMinute % durationHour;\n if (offset < 0) offset += durationHour;\n date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval\";\nimport {durationDay, durationMinute} from \"./duration\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval\";\nimport {durationMinute, durationWeek} from \"./duration\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","import interval from \"./interval\";\nimport {durationHour} from \"./duration\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval\";\nimport {durationDay} from \"./duration\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval\";\nimport {durationWeek} from \"./duration\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newYear(d.y)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = newDate(newYear(d.y)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat\";\nimport {utcParse} from \"./defaultLocale\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import {bisector, tickStep} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n durationMinute = durationSecond * 60,\n durationHour = durationMinute * 60,\n durationDay = durationHour * 24,\n durationWeek = durationDay * 7,\n durationMonth = durationDay * 30,\n durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(deinterpolate, reinterpolate),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\nexport default function() {\n return calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default function(scheme) {\n return interpolateRgbBasis(scheme[scheme.length - 1]);\n}\n","import colors from \"../colors\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"d8b365f5f5f55ab4ac\",\n \"a6611adfc27d80cdc1018571\",\n \"a6611adfc27df5f5f580cdc1018571\",\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"af8dc3f7f7f77fbf7b\",\n \"7b3294c2a5cfa6dba0008837\",\n \"7b3294c2a5cff7f7f7a6dba0008837\",\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e9a3c9f7f7f7a1d76a\",\n \"d01c8bf1b6dab8e1864dac26\",\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"998ec3f7f7f7f1a340\",\n \"5e3c99b2abd2fdb863e66101\",\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\n \"542788998ec3d8daebfee0b6f1a340b35806\",\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62f7f7f767a9cf\",\n \"ca0020f4a58292c5de0571b0\",\n \"ca0020f4a582f7f7f792c5de0571b0\",\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62ffffff999999\",\n \"ca0020f4a582bababa404040\",\n \"ca0020f4a582ffffffbababa404040\",\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91bfdb\",\n \"d7191cfdae61abd9e92c7bb6\",\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91cf60\",\n \"d7191cfdae61a6d96a1a9641\",\n \"d7191cfdae61ffffbfa6d96a1a9641\",\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf99d594\",\n \"d7191cfdae61abdda42b83ba\",\n \"d7191cfdae61ffffbfabdda42b83ba\",\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5f999d8c92ca25f\",\n \"edf8fbb2e2e266c2a4238b45\",\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0ecf49ebcda8856a7\",\n \"edf8fbb3cde38c96c688419d\",\n \"edf8fbb3cde38c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0f3dba8ddb543a2ca\",\n \"f0f9e8bae4bc7bccc42b8cbe\",\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee8c8fdbb84e34a33\",\n \"fef0d9fdcc8afc8d59d7301f\",\n \"fef0d9fdcc8afc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece2f0a6bddb1c9099\",\n \"f6eff7bdc9e167a9cf02818a\",\n \"f6eff7bdc9e167a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece7f2a6bddb2b8cbe\",\n \"f1eef6bdc9e174a9cf0570b0\",\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e7e1efc994c7dd1c77\",\n \"f1eef6d7b5d8df65b0ce1256\",\n \"f1eef6d7b5d8df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fde0ddfa9fb5c51b8a\",\n \"feebe2fbb4b9f768a1ae017e\",\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"edf8b17fcdbb2c7fb8\",\n \"ffffcca1dab441b6c4225ea8\",\n \"ffffcca1dab441b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f7fcb9addd8e31a354\",\n \"ffffccc2e69978c679238443\",\n \"ffffccc2e69978c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fff7bcfec44fd95f0e\",\n \"ffffd4fed98efe9929cc4c02\",\n \"ffffd4fed98efe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ffeda0feb24cf03b20\",\n \"ffffb2fecc5cfd8d3ce31a1c\",\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"deebf79ecae13182bd\",\n \"eff3ffbdd7e76baed62171b5\",\n \"eff3ffbdd7e76baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5e0a1d99b31a354\",\n \"edf8e9bae4b374c476238b45\",\n \"edf8e9bae4b374c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f0f0f0bdbdbd636363\",\n \"f7f7f7cccccc969696525252\",\n \"f7f7f7cccccc969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"efedf5bcbddc756bb1\",\n \"f2f0f7cbc9e29e9ac86a51a3\",\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee0d2fc9272de2d26\",\n \"fee5d9fcae91fb6a4acb181d\",\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee6cefdae6be6550d\",\n \"feeddefdbe85fd8d3cd94701\",\n \"feeddefdbe85fd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n c.h = 360 * t - 100;\n c.s = 1.5 - 1.5 * ts;\n c.l = 0.8 - 0.9 * ts;\n return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n pi_1_3 = Math.PI / 3,\n pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n var x;\n t = (0.5 - t) * Math.PI;\n c.r = 255 * (x = Math.sin(t)) * x;\n c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n return c + \"\";\n}\n","import colors from \"../colors\";\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial\";\nimport line from \"./line\";\n\nexport function lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nexport default function() {\n return lineRadial(line().curve(curveRadialLinear));\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport offsetNone from \"./offset/none\";\nimport orderNone from \"./order/none\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","function RedBlackTree() {\n this._ = null; // root node\n}\n\nexport function RedBlackNode(node) {\n node.U = // parent node\n node.C = // color - true for red, false for black\n node.L = // left node\n node.R = // right node\n node.P = // previous node\n node.N = null; // next node\n}\n\nRedBlackTree.prototype = {\n constructor: RedBlackTree,\n\n insert: function(after, node) {\n var parent, grandpa, uncle;\n\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = RedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n RedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n RedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n\n var parent = node.U,\n sibling,\n left = node.L,\n right = node.R,\n next,\n red;\n\n if (!left) next = right;\n else if (!right) next = left;\n else next = RedBlackFirst(right);\n\n if (parent) {\n if (parent.L === node) parent.L = next;\n else parent.R = next;\n } else {\n this._ = next;\n }\n\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) { node.C = false; return; }\n\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n RedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n RedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n RedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n RedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n\n if (node) node.C = false;\n }\n};\n\nfunction RedBlackRotateLeft(tree, node) {\n var p = node,\n q = node.R,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n}\n\nfunction RedBlackRotateRight(tree, node) {\n var p = node,\n q = node.L,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n}\n\nfunction RedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n}\n\nexport default RedBlackTree;\n","import {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createEdge(left, right, v0, v1) {\n var edge = [null, null],\n index = edges.push(edge) - 1;\n edge.left = left;\n edge.right = right;\n if (v0) setEdgeEnd(edge, left, right, v0);\n if (v1) setEdgeEnd(edge, right, left, v1);\n cells[left.index].halfedges.push(index);\n cells[right.index].halfedges.push(index);\n return edge;\n}\n\nexport function createBorderEdge(left, v0, v1) {\n var edge = [v0, v1];\n edge.left = left;\n return edge;\n}\n\nexport function setEdgeEnd(edge, left, right, vertex) {\n if (!edge[0] && !edge[1]) {\n edge[0] = vertex;\n edge.left = left;\n edge.right = right;\n } else if (edge.left === right) {\n edge[1] = vertex;\n } else {\n edge[0] = vertex;\n }\n}\n\n// Liang–Barsky line clipping.\nfunction clipEdge(edge, x0, y0, x1, y1) {\n var a = edge[0],\n b = edge[1],\n ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\n\n if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\n if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\n return true;\n}\n\nfunction connectEdge(edge, x0, y0, x1, y1) {\n var v1 = edge[1];\n if (v1) return true;\n\n var v0 = edge[0],\n left = edge.left,\n right = edge.right,\n lx = left[0],\n ly = left[1],\n rx = right[0],\n ry = right[1],\n fx = (lx + rx) / 2,\n fy = (ly + ry) / 2,\n fm,\n fb;\n\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!v0) v0 = [fx, y0];\n else if (v0[1] >= y1) return;\n v1 = [fx, y1];\n } else {\n if (!v0) v0 = [fx, y1];\n else if (v0[1] < y0) return;\n v1 = [fx, y0];\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!v0) v0 = [(y0 - fb) / fm, y0];\n else if (v0[1] >= y1) return;\n v1 = [(y1 - fb) / fm, y1];\n } else {\n if (!v0) v0 = [(y1 - fb) / fm, y1];\n else if (v0[1] < y0) return;\n v1 = [(y0 - fb) / fm, y0];\n }\n } else {\n if (ly < ry) {\n if (!v0) v0 = [x0, fm * x0 + fb];\n else if (v0[0] >= x1) return;\n v1 = [x1, fm * x1 + fb];\n } else {\n if (!v0) v0 = [x1, fm * x1 + fb];\n else if (v0[0] < x0) return;\n v1 = [x0, fm * x0 + fb];\n }\n }\n }\n\n edge[0] = v0;\n edge[1] = v1;\n return true;\n}\n\nexport function clipEdges(x0, y0, x1, y1) {\n var i = edges.length,\n edge;\n\n while (i--) {\n if (!connectEdge(edge = edges[i], x0, y0, x1, y1)\n || !clipEdge(edge, x0, y0, x1, y1)\n || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon\n || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {\n delete edges[i];\n }\n }\n}\n","import {createBorderEdge} from \"./Edge\";\nimport {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createCell(site) {\n return cells[site.index] = {\n site: site,\n halfedges: []\n };\n}\n\nfunction cellHalfedgeAngle(cell, edge) {\n var site = cell.site,\n va = edge.left,\n vb = edge.right;\n if (site === vb) vb = va, va = site;\n if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\n if (site === va) va = edge[1], vb = edge[0];\n else va = edge[0], vb = edge[1];\n return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\n}\n\nexport function cellHalfedgeStart(cell, edge) {\n return edge[+(edge.left !== cell.site)];\n}\n\nexport function cellHalfedgeEnd(cell, edge) {\n return edge[+(edge.left === cell.site)];\n}\n\nexport function sortCellHalfedges() {\n for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\n if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\n var index = new Array(m),\n array = new Array(m);\n for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);\n index.sort(function(i, j) { return array[j] - array[i]; });\n for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\n for (j = 0; j < m; ++j) halfedges[j] = array[j];\n }\n }\n}\n\nexport function clipCells(x0, y0, x1, y1) {\n var nCells = cells.length,\n iCell,\n cell,\n site,\n iHalfedge,\n halfedges,\n nHalfedges,\n start,\n startX,\n startY,\n end,\n endX,\n endY,\n cover = true;\n\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n halfedges = cell.halfedges;\n iHalfedge = halfedges.length;\n\n // Remove any dangling clipped edges.\n while (iHalfedge--) {\n if (!edges[halfedges[iHalfedge]]) {\n halfedges.splice(iHalfedge, 1);\n }\n }\n\n // Insert any border edges as necessary.\n iHalfedge = 0, nHalfedges = halfedges.length;\n while (iHalfedge < nHalfedges) {\n end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\n start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\n if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {\n halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,\n Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]\n : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]\n : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]\n : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]\n : null)) - 1);\n ++nHalfedges;\n }\n }\n\n if (nHalfedges) cover = false;\n }\n }\n\n // If there weren’t any edges, have the closest site cover the extent.\n // It doesn’t matter which corner of the extent we measure!\n if (cover) {\n var dx, dy, d2, dc = Infinity;\n\n for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n dx = site[0] - x0;\n dy = site[1] - y0;\n d2 = dx * dx + dy * dy;\n if (d2 < dc) dc = d2, cover = cell;\n }\n }\n\n if (cover) {\n var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\n cover.halfedges.push(\n edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\n edges.push(createBorderEdge(site, v01, v11)) - 1,\n edges.push(createBorderEdge(site, v11, v10)) - 1,\n edges.push(createBorderEdge(site, v10, v00)) - 1\n );\n }\n }\n\n // Lastly delete any cells with no edges; these were entirely clipped.\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n if (!cell.halfedges.length) {\n delete cells[iCell];\n }\n }\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {circles, epsilon2} from \"./Diagram\";\n\nvar circlePool = [];\n\nexport var firstCircle;\n\nfunction Circle() {\n RedBlackNode(this);\n this.x =\n this.y =\n this.arc =\n this.site =\n this.cy = null;\n}\n\nexport function attachCircle(arc) {\n var lArc = arc.P,\n rArc = arc.N;\n\n if (!lArc || !rArc) return;\n\n var lSite = lArc.site,\n cSite = arc.site,\n rSite = rArc.site;\n\n if (lSite === rSite) return;\n\n var bx = cSite[0],\n by = cSite[1],\n ax = lSite[0] - bx,\n ay = lSite[1] - by,\n cx = rSite[0] - bx,\n cy = rSite[1] - by;\n\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -epsilon2) return;\n\n var ha = ax * ax + ay * ay,\n hc = cx * cx + cy * cy,\n x = (cy * ha - ay * hc) / d,\n y = (ax * hc - cx * ha) / d;\n\n var circle = circlePool.pop() || new Circle;\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\n\n arc.circle = circle;\n\n var before = null,\n node = circles._;\n\n while (node) {\n if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\n if (node.L) node = node.L;\n else { before = node.P; break; }\n } else {\n if (node.R) node = node.R;\n else { before = node; break; }\n }\n }\n\n circles.insert(before, circle);\n if (!before) firstCircle = circle;\n}\n\nexport function detachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) firstCircle = circle.N;\n circles.remove(circle);\n circlePool.push(circle);\n RedBlackNode(circle);\n arc.circle = null;\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {createCell} from \"./Cell\";\nimport {attachCircle, detachCircle} from \"./Circle\";\nimport {createEdge, setEdgeEnd} from \"./Edge\";\nimport {beaches, epsilon} from \"./Diagram\";\n\nvar beachPool = [];\n\nfunction Beach() {\n RedBlackNode(this);\n this.edge =\n this.site =\n this.circle = null;\n}\n\nfunction createBeach(site) {\n var beach = beachPool.pop() || new Beach;\n beach.site = site;\n return beach;\n}\n\nfunction detachBeach(beach) {\n detachCircle(beach);\n beaches.remove(beach);\n beachPool.push(beach);\n RedBlackNode(beach);\n}\n\nexport function removeBeach(beach) {\n var circle = beach.circle,\n x = circle.x,\n y = circle.cy,\n vertex = [x, y],\n previous = beach.P,\n next = beach.N,\n disappearing = [beach];\n\n detachBeach(beach);\n\n var lArc = previous;\n while (lArc.circle\n && Math.abs(x - lArc.circle.x) < epsilon\n && Math.abs(y - lArc.circle.cy) < epsilon) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n detachBeach(lArc);\n lArc = previous;\n }\n\n disappearing.unshift(lArc);\n detachCircle(lArc);\n\n var rArc = next;\n while (rArc.circle\n && Math.abs(x - rArc.circle.x) < epsilon\n && Math.abs(y - rArc.circle.cy) < epsilon) {\n next = rArc.N;\n disappearing.push(rArc);\n detachBeach(rArc);\n rArc = next;\n }\n\n disappearing.push(rArc);\n detachCircle(rArc);\n\n var nArcs = disappearing.length,\n iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\n\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nexport function addBeach(site) {\n var x = site[0],\n directrix = site[1],\n lArc,\n rArc,\n dxl,\n dxr,\n node = beaches._;\n\n while (node) {\n dxl = leftBreakPoint(node, directrix) - x;\n if (dxl > epsilon) node = node.L; else {\n dxr = x - rightBreakPoint(node, directrix);\n if (dxr > epsilon) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -epsilon) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -epsilon) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n\n createCell(site);\n var newArc = createBeach(site);\n beaches.insert(lArc, newArc);\n\n if (!lArc && !rArc) return;\n\n if (lArc === rArc) {\n detachCircle(lArc);\n rArc = createBeach(lArc.site);\n beaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\n attachCircle(lArc);\n attachCircle(rArc);\n return;\n }\n\n if (!rArc) { // && lArc\n newArc.edge = createEdge(lArc.site, newArc.site);\n return;\n }\n\n // else lArc !== rArc\n detachCircle(lArc);\n detachCircle(rArc);\n\n var lSite = lArc.site,\n ax = lSite[0],\n ay = lSite[1],\n bx = site[0] - ax,\n by = site[1] - ay,\n rSite = rArc.site,\n cx = rSite[0] - ax,\n cy = rSite[1] - ay,\n d = 2 * (bx * cy - by * cx),\n hb = bx * bx + by * by,\n hc = cx * cx + cy * cy,\n vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\n\n setEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = createEdge(lSite, site, null, vertex);\n rArc.edge = createEdge(site, rSite, null, vertex);\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nfunction leftBreakPoint(arc, directrix) {\n var site = arc.site,\n rfocx = site[0],\n rfocy = site[1],\n pby2 = rfocy - directrix;\n\n if (!pby2) return rfocx;\n\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n\n site = lArc.site;\n var lfocx = site[0],\n lfocy = site[1],\n plby2 = lfocy - directrix;\n\n if (!plby2) return lfocx;\n\n var hl = lfocx - rfocx,\n aby2 = 1 / pby2 - 1 / plby2,\n b = hl / plby2;\n\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n\n return (rfocx + lfocx) / 2;\n}\n\nfunction rightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return leftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site[1] === directrix ? site[0] : Infinity;\n}\n","import {addBeach, removeBeach} from \"./Beach\";\nimport {sortCellHalfedges, cellHalfedgeStart, clipCells} from \"./Cell\";\nimport {firstCircle} from \"./Circle\";\nimport {clipEdges} from \"./Edge\";\nimport RedBlackTree from \"./RedBlackTree\";\n\nexport var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var beaches;\nexport var cells;\nexport var circles;\nexport var edges;\n\nfunction triangleArea(a, b, c) {\n return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\n}\n\nfunction lexicographic(a, b) {\n return b[1] - a[1]\n || b[0] - a[0];\n}\n\nexport default function Diagram(sites, extent) {\n var site = sites.sort(lexicographic).pop(),\n x,\n y,\n circle;\n\n edges = [];\n cells = new Array(sites.length);\n beaches = new RedBlackTree;\n circles = new RedBlackTree;\n\n while (true) {\n circle = firstCircle;\n if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\n if (site[0] !== x || site[1] !== y) {\n addBeach(site);\n x = site[0], y = site[1];\n }\n site = sites.pop();\n } else if (circle) {\n removeBeach(circle.arc);\n } else {\n break;\n }\n }\n\n sortCellHalfedges();\n\n if (extent) {\n var x0 = +extent[0][0],\n y0 = +extent[0][1],\n x1 = +extent[1][0],\n y1 = +extent[1][1];\n clipEdges(x0, y0, x1, y1);\n clipCells(x0, y0, x1, y1);\n }\n\n this.edges = edges;\n this.cells = cells;\n\n beaches =\n circles =\n edges =\n cells = null;\n}\n\nDiagram.prototype = {\n constructor: Diagram,\n\n polygons: function() {\n var edges = this.edges;\n\n return this.cells.map(function(cell) {\n var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\n polygon.data = cell.site.data;\n return polygon;\n });\n },\n\n triangles: function() {\n var triangles = [],\n edges = this.edges;\n\n this.cells.forEach(function(cell, i) {\n if (!(m = (halfedges = cell.halfedges).length)) return;\n var site = cell.site,\n halfedges,\n j = -1,\n m,\n s0,\n e1 = edges[halfedges[m - 1]],\n s1 = e1.left === site ? e1.right : e1.left;\n\n while (++j < m) {\n s0 = s1;\n e1 = edges[halfedges[j]];\n s1 = e1.left === site ? e1.right : e1.left;\n if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\n triangles.push([site.data, s0.data, s1.data]);\n }\n }\n });\n\n return triangles;\n },\n\n links: function() {\n return this.edges.filter(function(edge) {\n return edge.right;\n }).map(function(edge) {\n return {\n source: edge.left.data,\n target: edge.right.data\n };\n });\n },\n\n find: function(x, y, radius) {\n var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\n\n // Use the previously-found cell, or start with an arbitrary one.\n while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\n var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\n\n // Traverse the half-edges to find a closer cell, if any.\n do {\n cell = that.cells[i0 = i1], i1 = null;\n cell.halfedges.forEach(function(e) {\n var edge = that.edges[e], v = edge.left;\n if ((v === cell.site || !v) && !(v = edge.right)) return;\n var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\n if (v2 < d2) d2 = v2, i1 = v.index;\n });\n } while (i1 !== null);\n\n that._found = i0;\n\n return radius == null || d2 <= radius * radius ? cell.site : null;\n }\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n return node.__zoom || identity;\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// Creation of a stacked histogram with D3.js for software origin visits history\n// Parameters description:\n// - container: selector for the div that will contain the histogram\n// - visitsData: raw swh origin visits data\n// - currentYear: the visits year to display by default\n// - yearClickCallback: callback when the user selects a year through the histogram\n\nimport * as d3 from 'd3';\n\nexport function createVisitsHistogram(container, visitsData, currentYear, yearClickCallback) {\n\n // remove previously created histogram and tooltip if any\n d3.select(container).select('svg').remove();\n d3.select('div.d3-tooltip').remove();\n\n // histogram size and margins\n let width = 1000;\n let height = 300;\n let margin = {top: 20, right: 80, bottom: 30, left: 50};\n\n // create responsive svg\n let svg = d3.select(container)\n .attr('style',\n 'padding-bottom: ' + Math.ceil(height * 100 / width) + '%')\n .append('svg')\n .attr('viewBox', '0 0 ' + width + ' ' + height);\n\n // create tooltip div\n let tooltip = d3.select('body')\n .append('div')\n .attr('class', 'd3-tooltip')\n .style('opacity', 0);\n\n // update width and height without margins\n width = width - margin.left - margin.right;\n height = height - margin.top - margin.bottom;\n\n // create main svg group element\n let g = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\n // create x scale\n let x = d3.scaleTime().rangeRound([0, width]);\n\n // create y scale\n let y = d3.scaleLinear().range([height, 0]);\n\n // create ordinal colorscale mapping visit status\n let colors = d3.scaleOrdinal()\n .domain(['full', 'partial', 'failed', 'ongoing'])\n .range(['#008000', '#edc344', '#ff0000', '#0000ff']);\n\n // first swh crawls were made in 2015\n let startYear = 2015;\n // set latest display year as the current one\n let now = new Date();\n let endYear = now.getUTCFullYear() + 1;\n let monthExtent = [new Date(Date.UTC(startYear, 0, 1)), new Date(Date.UTC(endYear, 0, 1))];\n\n // create months bins based on setup extent\n let monthBins = d3.timeMonths(d3.timeMonth.offset(monthExtent[0], -1), monthExtent[1]);\n // create years bins based on setup extent\n let yearBins = d3.timeYears(monthExtent[0], monthExtent[1]);\n\n // set x scale domain\n x.domain(d3.extent(monthBins));\n\n // use D3 histogram layout to create a function that will bin the visits by month\n let binByMonth = d3.histogram()\n .value(d => d.date)\n .domain(x.domain())\n .thresholds(monthBins);\n\n // use D3 nest function to group the visits by status\n let visitsByStatus = d3.nest()\n .key(d => d['status'])\n .sortKeys(d3.ascending)\n .entries(visitsData);\n\n // prepare data in order to be able to stack visit statuses by month\n let statuses = [];\n let histData = [];\n for (let i = 0; i < monthBins.length; ++i) {\n histData[i] = {};\n }\n visitsByStatus.forEach(entry => {\n statuses.push(entry.key);\n let monthsData = binByMonth(entry.values);\n for (let i = 0; i < monthsData.length; ++i) {\n histData[i]['x0'] = monthsData[i]['x0'];\n histData[i]['x1'] = monthsData[i]['x1'];\n histData[i][entry.key] = monthsData[i];\n }\n });\n\n // create function to stack visits statuses by month\n let stacked = d3.stack()\n .keys(statuses)\n .value((d, key) => d[key].length);\n\n // compute the maximum amount of visits by month\n let yMax = d3.max(histData, d => {\n let total = 0;\n for (let i = 0; i < statuses.length; ++i) {\n total += d[statuses[i]].length;\n }\n return total;\n });\n\n // set y scale domain\n y.domain([0, yMax]);\n\n // compute ticks values for the y axis\n let step = 5;\n let yTickValues = [];\n for (let i = 0; i <= yMax / step; ++i) {\n yTickValues.push(i * step);\n }\n if (yTickValues.length === 0) {\n for (let i = 0; i <= yMax; ++i) {\n yTickValues.push(i);\n }\n } else if (yMax % step !== 0) {\n yTickValues.push(yMax);\n }\n\n // add histogram background grid\n g.append('g')\n .attr('class', 'grid')\n .call(d3.axisLeft(y)\n .tickValues(yTickValues)\n .tickSize(-width)\n .tickFormat(''));\n\n // create one fill only rectangle by displayed year\n // each rectangle will be made visible when hovering the mouse over a year range\n // user will then be able to select a year by clicking in the rectangle\n g.append('g')\n .selectAll('rect')\n .data(yearBins)\n .enter().append('rect')\n .attr('class', d => 'year' + d.getUTCFullYear())\n .attr('fill', 'red')\n .attr('fill-opacity', d => d.getUTCFullYear() === currentYear ? 0.3 : 0)\n .attr('stroke', 'none')\n .attr('x', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return x(date);\n })\n .attr('y', 0)\n .attr('height', height)\n .attr('width', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return yearWidth;\n })\n // mouse event callbacks used to show rectangle years\n // when hovering the mouse over the histograms\n .on('mouseover', d => {\n svg.selectAll('rect.year' + d.getUTCFullYear())\n .attr('fill-opacity', 0.5);\n })\n .on('mouseout', d => {\n svg.selectAll('rect.year' + d.getUTCFullYear())\n .attr('fill-opacity', 0);\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.3);\n })\n // callback to select a year after a mouse click\n // in a rectangle year\n .on('click', d => {\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'none');\n currentYear = d.getUTCFullYear();\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.5);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'black');\n yearClickCallback(currentYear);\n });\n\n // create the stacked histogram of visits\n g.append('g')\n .selectAll('g')\n .data(stacked(histData))\n .enter().append('g')\n .attr('fill', d => colors(d.key))\n .selectAll('rect')\n .data(d => d)\n .enter().append('rect')\n .attr('class', d => 'month' + d.data.x1.getMonth())\n .attr('x', d => x(d.data.x0))\n .attr('y', d => y(d[1]))\n .attr('height', d => y(d[0]) - y(d[1]))\n .attr('width', d => x(d.data.x1) - x(d.data.x0) - 1)\n // mouse event callbacks used to show rectangle years\n // but also to show tooltip when hovering the mouse\n // over the histogram bars\n .on('mouseover', d => {\n svg.selectAll('rect.year' + d.data.x1.getUTCFullYear())\n .attr('fill-opacity', 0.5);\n tooltip.transition()\n .duration(200)\n .style('opacity', 1);\n let ds = d.data.x1.toISOString().substr(0, 7).split('-');\n let tooltipText = '' + ds[1] + ' / ' + ds[0] + ':
';\n for (let i = 0; i < statuses.length; ++i) {\n let visitStatus = statuses[i];\n let nbVisits = d.data[visitStatus].length;\n if (nbVisits === 0) continue;\n tooltipText += nbVisits + ' ' + visitStatus + ' visits';\n if (i !== statuses.length - 1) tooltipText += '
';\n }\n tooltip.html(tooltipText)\n .style('left', d3.event.pageX + 15 + 'px')\n .style('top', d3.event.pageY + 'px');\n })\n .on('mouseout', d => {\n svg.selectAll('rect.year' + d.data.x1.getUTCFullYear())\n .attr('fill-opacity', 0);\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.3);\n tooltip.transition()\n .duration(500)\n .style('opacity', 0);\n })\n .on('mousemove', () => {\n tooltip.style('left', d3.event.pageX + 15 + 'px')\n .style('top', d3.event.pageY + 'px');\n })\n // callback to select a year after a mouse click\n // inside a histogram bar\n .on('click', d => {\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'none');\n currentYear = d.data.x1.getUTCFullYear();\n svg.selectAll('rect.year' + currentYear)\n .attr('fill-opacity', 0.5);\n svg.selectAll('rect.yearoutline' + currentYear)\n .attr('stroke', 'black');\n yearClickCallback(currentYear);\n });\n\n // create one stroke only rectangle by displayed year\n // that will be displayed on top of the histogram when the user has selected a year\n g.append('g')\n .selectAll('rect')\n .data(yearBins)\n .enter().append('rect')\n .attr('class', d => 'yearoutline' + d.getUTCFullYear())\n .attr('fill', 'none')\n .attr('stroke', d => d.getUTCFullYear() === currentYear ? 'black' : 'none')\n .attr('x', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return x(date);\n })\n .attr('y', 0)\n .attr('height', height)\n .attr('width', d => {\n let date = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return yearWidth;\n });\n\n // add x axis with a tick for every 1st day of each year\n let xAxis = g.append('g')\n .attr('class', 'axis')\n .attr('transform', 'translate(0,' + height + ')')\n .call(\n d3.axisBottom(x)\n .ticks(d3.timeYear.every(1))\n .tickFormat(d => d.getUTCFullYear())\n );\n\n // shift tick labels in order to display them at the middle\n // of each year range\n xAxis.selectAll('text')\n .attr('transform', d => {\n let year = d.getUTCFullYear();\n let date = new Date(Date.UTC(year, 0, 1));\n let yearWidth = x(d3.timeYear.offset(date, 1)) - x(date);\n return 'translate(' + -yearWidth / 2 + ', 0)';\n });\n\n // add y axis for the number of visits\n g.append('g')\n .attr('class', 'axis')\n .call(d3.axisLeft(y).tickValues(yTickValues));\n\n // add legend for visit statuses\n let legendGroup = g.append('g')\n .attr('font-family', 'sans-serif')\n .attr('font-size', 10)\n .attr('text-anchor', 'end');\n\n legendGroup.append('text')\n .attr('x', width + margin.right - 5)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text('visit status:');\n\n let legend = legendGroup.selectAll('g')\n .data(statuses.slice().reverse())\n .enter().append('g')\n .attr('transform', (d, i) => 'translate(0,' + (i + 1) * 20 + ')');\n\n legend.append('rect')\n .attr('x', width + 2 * margin.right / 3)\n .attr('width', 19)\n .attr('height', 19)\n .attr('fill', colors);\n\n legend.append('text')\n .attr('x', width + 2 * margin.right / 3 - 5)\n .attr('y', 9.5)\n .attr('dy', '0.32em')\n .text(d => d);\n\n // add text label for the y axis\n g.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -margin.left)\n .attr('x', -(height / 2))\n .attr('dy', '1em')\n .style('text-anchor', 'middle')\n .text('Number of visits');\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport 'bootstrap-year-calendar';\nimport 'bootstrap-year-calendar/css/bootstrap-year-calendar.css';\n\nlet minSize = 15;\nlet maxSize = 28;\nlet currentPopover = null;\nlet visitsByDate = {};\n\nfunction closePopover() {\n if (currentPopover) {\n $(currentPopover).popover('hide');\n currentPopover = null;\n }\n}\n\n// function to update the visits calendar view based on the selected year\nexport function updateCalendar(year, filteredVisits, yearClickedCallback) {\n visitsByDate = {};\n let maxNbVisitsByDate = 0;\n let minDate, maxDate;\n for (let i = 0; i < filteredVisits.length; ++i) {\n filteredVisits[i]['startDate'] = filteredVisits[i]['date'];\n filteredVisits[i]['endDate'] = filteredVisits[i]['startDate'];\n let date = new Date(filteredVisits[i]['date']);\n date.setHours(0, 0, 0, 0);\n let dateStr = date.toDateString();\n if (!visitsByDate.hasOwnProperty(dateStr)) {\n visitsByDate[dateStr] = [filteredVisits[i]];\n } else {\n visitsByDate[dateStr].push(filteredVisits[i]);\n }\n maxNbVisitsByDate = Math.max(maxNbVisitsByDate, visitsByDate[dateStr].length);\n if (i === 0) {\n minDate = maxDate = date;\n } else {\n if (date.getTime() < minDate.getTime()) {\n minDate = date;\n }\n if (date.getTime() > maxDate.getTime()) {\n maxDate = date;\n }\n }\n }\n\n closePopover();\n\n $('#swh-visits-calendar').calendar({\n dataSource: filteredVisits,\n style: 'custom',\n minDate: minDate,\n maxDate: maxDate,\n startYear: year,\n renderEnd: e => yearClickedCallback(e.currentYear),\n customDataSourceRenderer: (element, date, events) => {\n let dateStr = date.toDateString();\n let nbVisits = visitsByDate[dateStr].length;\n let t = nbVisits / maxNbVisitsByDate;\n if (maxNbVisitsByDate === 1) {\n t = 0;\n }\n let size = minSize + t * (maxSize - minSize);\n let offsetX = (maxSize - size) / 2 - parseInt($(element).css('padding-left'));\n let offsetY = (maxSize - size) / 2 - parseInt($(element).css('padding-top')) + 1;\n let cellWrapper = $('
');\n cellWrapper.css('position', 'relative');\n let dayNumber = $('
');\n dayNumber.text($(element).text());\n let circle = $('
');\n let r = 0;\n let g = 0;\n for (let i = 0; i < nbVisits; ++i) {\n let visit = visitsByDate[dateStr][i];\n if (visit.status === 'full') {\n g += 255;\n } else if (visit.status === 'partial') {\n r += 255;\n g += 255;\n } else {\n r += 255;\n }\n }\n r /= nbVisits;\n g /= nbVisits;\n circle.css('background-color', 'rgba(' + r + ', ' + g + ', 0, 0.3)');\n circle.css('width', size + 'px');\n circle.css('height', size + 'px');\n circle.css('border-radius', size + 'px');\n circle.css('position', 'absolute');\n circle.css('top', offsetY + 'px');\n circle.css('left', offsetX + 'px');\n cellWrapper.append(dayNumber);\n cellWrapper.append(circle);\n $(element)[0].innerHTML = $(cellWrapper)[0].outerHTML;\n },\n mouseOnDay: e => {\n if (currentPopover !== e.element) {\n closePopover();\n }\n let dateStr = e.date.toDateString();\n if (visitsByDate.hasOwnProperty(dateStr)) {\n\n let visits = visitsByDate[dateStr];\n let content = '
' + e.date.toDateString() + '
';\n content += '
    ';\n for (let i = 0; i < visits.length; ++i) {\n let visitTime = visits[i].fmt_date.substr(visits[i].fmt_date.indexOf(',') + 2);\n content += '
  • ' + visitTime + '
  • ';\n }\n content += '
';\n\n $(e.element).popover({\n trigger: 'manual',\n container: 'body',\n html: true,\n content: content\n });\n\n $(e.element).popover('show');\n currentPopover = e.element;\n }\n }\n });\n $('#swh-visits-timeline').mouseenter(() => {\n closePopover();\n });\n $('#swh-visits-list').mouseenter(() => {\n closePopover();\n });\n $('#swh-visits-calendar.calendar table td').css('width', maxSize + 'px');\n $('#swh-visits-calendar.calendar table td').css('height', maxSize + 'px');\n $('#swh-visits-calendar.calendar table td').css('padding', '0px');\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {createVisitsHistogram} from './visits-histogram';\nimport {updateCalendar} from './visits-calendar';\nimport './visits-reporting.css';\n\n// will hold all visits\nlet allVisits;\n// will hold filtered visits to display\nlet filteredVisits;\n// will hold currently displayed year\nlet currentYear;\n\n// function to gather full visits\nfunction filterFullVisits(differentSnapshots) {\n let filteredVisits = [];\n for (let i = 0; i < allVisits.length; ++i) {\n if (allVisits[i].status !== 'full') continue;\n if (!differentSnapshots) {\n filteredVisits.push(allVisits[i]);\n } else if (filteredVisits.length === 0) {\n filteredVisits.push(allVisits[i]);\n } else {\n let lastVisit = filteredVisits[filteredVisits.length - 1];\n if (allVisits[i].snapshot !== lastVisit.snapshot) {\n filteredVisits.push(allVisits[i]);\n }\n }\n }\n return filteredVisits;\n}\n\n// function to update the visits list view based on the selected year\nfunction updateVisitsList(year) {\n $('#swh-visits-list').children().remove();\n let visitsByYear = [];\n for (let i = 0; i < filteredVisits.length; ++i) {\n if (filteredVisits[i].date.getUTCFullYear() === year) {\n visitsByYear.push(filteredVisits[i]);\n }\n }\n let visitsCpt = 0;\n let nbVisitsByRow = 4;\n let visitsListHtml = '
';\n for (let i = 0; i < visitsByYear.length; ++i) {\n if (visitsCpt > 0 && visitsCpt % nbVisitsByRow === 0) {\n visitsListHtml += '
';\n }\n visitsListHtml += '
';\n visitsListHtml += '' + visitsByYear[i].fmt_date + '';\n visitsListHtml += '
';\n ++visitsCpt;\n }\n visitsListHtml += '
';\n $('#swh-visits-list').append($(visitsListHtml));\n}\n\nfunction yearChangedCalendar(year) {\n currentYear = year;\n updateVisitsList(year);\n createVisitsHistogram('.d3-wrapper', filteredVisits, currentYear, yearClickedTimeline);\n}\n\n// callback when the user selects a year through the visits histogram\nfunction yearClickedTimeline(year) {\n currentYear = year;\n updateCalendar(year, filteredVisits, yearChangedCalendar);\n updateVisitsList(year);\n}\n\n// function to update the visits views (histogram, calendar, list)\nfunction updateDisplayedVisits() {\n if (filteredVisits.length === 0) {\n return;\n }\n if (!currentYear) {\n currentYear = filteredVisits[filteredVisits.length - 1].date.getUTCFullYear();\n }\n createVisitsHistogram('.d3-wrapper', filteredVisits, currentYear, yearClickedTimeline);\n updateCalendar(currentYear, filteredVisits, yearChangedCalendar);\n updateVisitsList(currentYear);\n}\n\n// callback when the user only wants to see full visits pointing\n// to different snapshots (default)\nexport function showFullVisitsDifferentSnapshots(event) {\n filteredVisits = filterFullVisits(true);\n updateDisplayedVisits();\n}\n\n// callback when the user only wants to see full visits\nexport function showFullVisits(event) {\n filteredVisits = filterFullVisits(false);\n updateDisplayedVisits();\n}\n\n// callback when the user wants to see all visits (including partial, ongoing and failed ones)\nexport function showAllVisits(event) {\n filteredVisits = allVisits;\n updateDisplayedVisits();\n}\n\nexport function initVisitsReporting(visits) {\n $(document).ready(() => {\n allVisits = visits;\n // process input visits\n let firstFullVisit;\n allVisits.forEach((v, i) => {\n // Turn Unix epoch into Javascript Date object\n v.date = new Date(Math.floor(v.date * 1000));\n let visitLink = '' + v.fmt_date + '';\n if (v.status === 'full') {\n if (!firstFullVisit) {\n firstFullVisit = v;\n $('#swh-first-full-visit').append($(visitLink));\n if (allVisits.length === 1) {\n $('#swh-last-full-visit')[0].innerHTML = visitLink;\n }\n } else {\n $('#swh-last-full-visit')[0].innerHTML = visitLink;\n }\n }\n if (i === allVisits.length - 1) {\n $('#swh-last-visit').append($(visitLink));\n }\n });\n\n // display full visits pointing to different snapshots by default\n showFullVisitsDifferentSnapshots();\n });\n\n}\n","/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// origin visits reporting bundle\n\nexport * from './visits-reporting';\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","require('../modules/es6.parse-int');\nmodule.exports = require('../modules/_core').parseInt;\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n","var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/swh/web/static/webpack-stats.json b/swh/web/static/webpack-stats.json index 5721f994..3744dd2b 100644 --- a/swh/web/static/webpack-stats.json +++ b/swh/web/static/webpack-stats.json @@ -1 +1 @@ -{"status":"done","publicPath":"/static/","chunks":{"vendors":[{"name":"css/vendors.ebdb90e76da36ff5e611.css","publicPath":"/static/css/vendors.ebdb90e76da36ff5e611.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/vendors.ebdb90e76da36ff5e611.css"},{"name":"js/vendors.ebdb90e76da36ff5e611.js","publicPath":"/static/js/vendors.ebdb90e76da36ff5e611.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vendors.ebdb90e76da36ff5e611.js"},{"name":"js/vendors.ebdb90e76da36ff5e611.js.map","publicPath":"/static/js/vendors.ebdb90e76da36ff5e611.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vendors.ebdb90e76da36ff5e611.js.map"}],"admin":[{"name":"js/admin.4ebdc9f536458c637197.js","publicPath":"/static/js/admin.4ebdc9f536458c637197.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/admin.4ebdc9f536458c637197.js"},{"name":"js/admin.4ebdc9f536458c637197.js.map","publicPath":"/static/js/admin.4ebdc9f536458c637197.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/admin.4ebdc9f536458c637197.js.map"}],"browse":[{"name":"css/browse.ab5be83726de277b08c7.css","publicPath":"/static/css/browse.ab5be83726de277b08c7.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/browse.ab5be83726de277b08c7.css"},{"name":"js/browse.ab5be83726de277b08c7.js","publicPath":"/static/js/browse.ab5be83726de277b08c7.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/browse.ab5be83726de277b08c7.js"},{"name":"js/browse.ab5be83726de277b08c7.js.map","publicPath":"/static/js/browse.ab5be83726de277b08c7.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/browse.ab5be83726de277b08c7.js.map"}],"highlightjs":[{"name":"css/highlightjs.7b32fa88e820b087cafd.css","publicPath":"/static/css/highlightjs.7b32fa88e820b087cafd.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/highlightjs.7b32fa88e820b087cafd.css"},{"name":"js/highlightjs.7b32fa88e820b087cafd.js","publicPath":"/static/js/highlightjs.7b32fa88e820b087cafd.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js"},{"name":"js/highlightjs.7b32fa88e820b087cafd.js.map","publicPath":"/static/js/highlightjs.7b32fa88e820b087cafd.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js.map"}],"origin":[{"name":"css/origin.245751215322daa84934.css","publicPath":"/static/css/origin.245751215322daa84934.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/origin.245751215322daa84934.css"},{"name":"js/origin.245751215322daa84934.js","publicPath":"/static/js/origin.245751215322daa84934.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/origin.245751215322daa84934.js"},{"name":"js/origin.245751215322daa84934.js.map","publicPath":"/static/js/origin.245751215322daa84934.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/origin.245751215322daa84934.js.map"}],"pdfjs":[{"name":"js/pdfjs.a2182ae126e9711b9149.js","publicPath":"/static/js/pdfjs.a2182ae126e9711b9149.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/pdfjs.a2182ae126e9711b9149.js"},{"name":"js/pdfjs.a2182ae126e9711b9149.js.map","publicPath":"/static/js/pdfjs.a2182ae126e9711b9149.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/pdfjs.a2182ae126e9711b9149.js.map"}],"revision":[{"name":"css/revision.84ec9135fe56255b5f3c.css","publicPath":"/static/css/revision.84ec9135fe56255b5f3c.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/revision.84ec9135fe56255b5f3c.css"},{"name":"js/revision.84ec9135fe56255b5f3c.js","publicPath":"/static/js/revision.84ec9135fe56255b5f3c.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/revision.84ec9135fe56255b5f3c.js"},{"name":"js/revision.84ec9135fe56255b5f3c.js.map","publicPath":"/static/js/revision.84ec9135fe56255b5f3c.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/revision.84ec9135fe56255b5f3c.js.map"}],"showdown":[{"name":"css/showdown.647625950777ab491cca.css","publicPath":"/static/css/showdown.647625950777ab491cca.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/showdown.647625950777ab491cca.css"},{"name":"js/showdown.647625950777ab491cca.js","publicPath":"/static/js/showdown.647625950777ab491cca.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/showdown.647625950777ab491cca.js"},{"name":"js/showdown.647625950777ab491cca.js.map","publicPath":"/static/js/showdown.647625950777ab491cca.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/showdown.647625950777ab491cca.js.map"}],"vault":[{"name":"css/vault.d6b1227ec2867753aa78.css","publicPath":"/static/css/vault.d6b1227ec2867753aa78.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/vault.d6b1227ec2867753aa78.css"},{"name":"js/vault.d6b1227ec2867753aa78.js","publicPath":"/static/js/vault.d6b1227ec2867753aa78.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vault.d6b1227ec2867753aa78.js"},{"name":"js/vault.d6b1227ec2867753aa78.js.map","publicPath":"/static/js/vault.d6b1227ec2867753aa78.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vault.d6b1227ec2867753aa78.js.map"}],"webapp":[{"name":"css/webapp.74f9a287fc2402da3850.css","publicPath":"/static/css/webapp.74f9a287fc2402da3850.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/webapp.74f9a287fc2402da3850.css"},{"name":"js/webapp.74f9a287fc2402da3850.js","publicPath":"/static/js/webapp.74f9a287fc2402da3850.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/webapp.74f9a287fc2402da3850.js"},{"name":"js/webapp.74f9a287fc2402da3850.js.map","publicPath":"/static/js/webapp.74f9a287fc2402da3850.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/webapp.74f9a287fc2402da3850.js.map"}]}} \ No newline at end of file +{"status":"done","publicPath":"/static/","chunks":{"vendors":[{"name":"css/vendors.ebdb90e76da36ff5e611.css","publicPath":"/static/css/vendors.ebdb90e76da36ff5e611.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/vendors.ebdb90e76da36ff5e611.css"},{"name":"js/vendors.ebdb90e76da36ff5e611.js","publicPath":"/static/js/vendors.ebdb90e76da36ff5e611.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vendors.ebdb90e76da36ff5e611.js"},{"name":"js/vendors.ebdb90e76da36ff5e611.js.map","publicPath":"/static/js/vendors.ebdb90e76da36ff5e611.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vendors.ebdb90e76da36ff5e611.js.map"}],"admin":[{"name":"js/admin.4ebdc9f536458c637197.js","publicPath":"/static/js/admin.4ebdc9f536458c637197.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/admin.4ebdc9f536458c637197.js"},{"name":"js/admin.4ebdc9f536458c637197.js.map","publicPath":"/static/js/admin.4ebdc9f536458c637197.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/admin.4ebdc9f536458c637197.js.map"}],"browse":[{"name":"css/browse.ab5be83726de277b08c7.css","publicPath":"/static/css/browse.ab5be83726de277b08c7.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/browse.ab5be83726de277b08c7.css"},{"name":"js/browse.ab5be83726de277b08c7.js","publicPath":"/static/js/browse.ab5be83726de277b08c7.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/browse.ab5be83726de277b08c7.js"},{"name":"js/browse.ab5be83726de277b08c7.js.map","publicPath":"/static/js/browse.ab5be83726de277b08c7.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/browse.ab5be83726de277b08c7.js.map"}],"highlightjs":[{"name":"css/highlightjs.7b32fa88e820b087cafd.css","publicPath":"/static/css/highlightjs.7b32fa88e820b087cafd.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/highlightjs.7b32fa88e820b087cafd.css"},{"name":"js/highlightjs.7b32fa88e820b087cafd.js","publicPath":"/static/js/highlightjs.7b32fa88e820b087cafd.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js"},{"name":"js/highlightjs.7b32fa88e820b087cafd.js.map","publicPath":"/static/js/highlightjs.7b32fa88e820b087cafd.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/highlightjs.7b32fa88e820b087cafd.js.map"}],"origin":[{"name":"css/origin.6b57666194b71082b679.css","publicPath":"/static/css/origin.6b57666194b71082b679.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/origin.6b57666194b71082b679.css"},{"name":"js/origin.6b57666194b71082b679.js","publicPath":"/static/js/origin.6b57666194b71082b679.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/origin.6b57666194b71082b679.js"},{"name":"js/origin.6b57666194b71082b679.js.map","publicPath":"/static/js/origin.6b57666194b71082b679.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/origin.6b57666194b71082b679.js.map"}],"pdfjs":[{"name":"js/pdfjs.a2182ae126e9711b9149.js","publicPath":"/static/js/pdfjs.a2182ae126e9711b9149.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/pdfjs.a2182ae126e9711b9149.js"},{"name":"js/pdfjs.a2182ae126e9711b9149.js.map","publicPath":"/static/js/pdfjs.a2182ae126e9711b9149.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/pdfjs.a2182ae126e9711b9149.js.map"}],"revision":[{"name":"css/revision.84ec9135fe56255b5f3c.css","publicPath":"/static/css/revision.84ec9135fe56255b5f3c.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/revision.84ec9135fe56255b5f3c.css"},{"name":"js/revision.84ec9135fe56255b5f3c.js","publicPath":"/static/js/revision.84ec9135fe56255b5f3c.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/revision.84ec9135fe56255b5f3c.js"},{"name":"js/revision.84ec9135fe56255b5f3c.js.map","publicPath":"/static/js/revision.84ec9135fe56255b5f3c.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/revision.84ec9135fe56255b5f3c.js.map"}],"showdown":[{"name":"css/showdown.647625950777ab491cca.css","publicPath":"/static/css/showdown.647625950777ab491cca.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/showdown.647625950777ab491cca.css"},{"name":"js/showdown.647625950777ab491cca.js","publicPath":"/static/js/showdown.647625950777ab491cca.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/showdown.647625950777ab491cca.js"},{"name":"js/showdown.647625950777ab491cca.js.map","publicPath":"/static/js/showdown.647625950777ab491cca.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/showdown.647625950777ab491cca.js.map"}],"vault":[{"name":"css/vault.d6b1227ec2867753aa78.css","publicPath":"/static/css/vault.d6b1227ec2867753aa78.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/vault.d6b1227ec2867753aa78.css"},{"name":"js/vault.d6b1227ec2867753aa78.js","publicPath":"/static/js/vault.d6b1227ec2867753aa78.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vault.d6b1227ec2867753aa78.js"},{"name":"js/vault.d6b1227ec2867753aa78.js.map","publicPath":"/static/js/vault.d6b1227ec2867753aa78.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/vault.d6b1227ec2867753aa78.js.map"}],"webapp":[{"name":"css/webapp.74f9a287fc2402da3850.css","publicPath":"/static/css/webapp.74f9a287fc2402da3850.css","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/css/webapp.74f9a287fc2402da3850.css"},{"name":"js/webapp.74f9a287fc2402da3850.js","publicPath":"/static/js/webapp.74f9a287fc2402da3850.js","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/webapp.74f9a287fc2402da3850.js"},{"name":"js/webapp.74f9a287fc2402da3850.js.map","publicPath":"/static/js/webapp.74f9a287fc2402da3850.js.map","path":"/home/ndandrim/work/swh-environment/swh-web/swh/web/static/js/webapp.74f9a287fc2402da3850.js.map"}]}} \ No newline at end of file diff --git a/swh/web/templates/browse/revision-log.html b/swh/web/templates/browse/revision-log.html index fc82ef5d..be9fbb52 100644 --- a/swh/web/templates/browse/revision-log.html +++ b/swh/web/templates/browse/revision-log.html @@ -1,126 +1,127 @@ {% extends "./browse.html" %} {% comment %} Copyright (C) 2017-2018 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information {% endcomment %} {% load render_bundle from webpack_loader %} {% load swh_templatetags %} {% block header %} {{ block.super }} {% render_bundle 'revision' %} {% endblock %} {% block swh-browse-content %} {% if snapshot_context %} {% include "includes/top-navigation.html" %} {% endif %} {% if snapshot_context and snapshot_context.is_empty %} {% include "includes/empty-snapshot.html" %} {% else %}
-
+ sort by: +
- +
-
+
- +
-
+
- +
-
+
- +
{% for rev in revision_log %} {% endfor %}
Revision Author Date Message Commit Date
{{ rev.id }} {{ rev.message }} {{ rev.commit_date }}
{% endif %} {% endblock %} {% block swh-browse-after-content %} {% if not snapshot_context or not snapshot_context.is_empty %} {% endif %} {% endblock %} diff --git a/swh/web/templates/includes/breadcrumbs.html b/swh/web/templates/includes/breadcrumbs.html index 3d6bf68a..5cfcbf04 100644 --- a/swh/web/templates/includes/breadcrumbs.html +++ b/swh/web/templates/includes/breadcrumbs.html @@ -1,19 +1,21 @@ {% comment %} Copyright (C) 2017-2018 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information {% endcomment %} - \ No newline at end of file +{% if breadcrumbs|length > 1 or breadcrumbs.0.url %} + +{% endif %} diff --git a/swh/web/templates/includes/directory-display.html b/swh/web/templates/includes/directory-display.html index bb6ee32f..9e185abe 100644 --- a/swh/web/templates/includes/directory-display.html +++ b/swh/web/templates/includes/directory-display.html @@ -1,69 +1,69 @@ {% comment %} Copyright (C) 2017-2018 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information {% endcomment %} {% if snapshot_context and snapshot_context.is_empty %} {% include "includes/empty-snapshot.html" %} {% elif dirs|length > 0 or files|length > 0 %}
{% for d in dirs %} {% endfor %} {% for f in files %} {% endfor %}
File Mode Size
+ - {{ d.name }} {{ d.perms }}
+ - {{ f.name }} {{ f.perms }} {{ f.length }}

{% elif dirs|length == 0 and files|length == 0 %} Directory is empty {% endif %} \ No newline at end of file diff --git a/swh/web/tests/api/test_apidoc.py b/swh/web/tests/api/test_apidoc.py index f84de924..9bbfc790 100644 --- a/swh/web/tests/api/test_apidoc.py +++ b/swh/web/tests/api/test_apidoc.py @@ -1,279 +1,279 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from rest_framework.test import APITestCase from rest_framework.response import Response from swh.web.api.apidoc import api_doc, _parse_httpdomain_doc from swh.web.api.apiurls import api_route from swh.web.tests.testcase import SWHWebTestCase # flake8: noqa httpdomain_doc = """ .. http:get:: /api/1/revision/(sha1_git)/ - Get information about a revision in the SWH archive. - Revisions are identified by *sha1* checksums, compatible with Git commit identifiers. + Get information about a revision in the archive. + Revisions are identified by **sha1** checksums, compatible with Git commit identifiers. See :func:`swh.model.identifiers.revision_identifier` in our data model module for details about how they are computed. - :param string sha1_git: hexadecimal representation of the revision *sha1_git* identifier + :param string sha1_git: hexadecimal representation of the revision **sha1_git** identifier :reqheader Accept: the requested response content type, - either *application/json* (default) or *application/yaml* + either ``application/json`` (default) or ``application/yaml`` :resheader Content-Type: this depends on :http:header:`Accept` header of request :>json object author: information about the author of the revision :>json string author_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the author of the revision :>json object committer: information about the committer of the revision :>json string committer_url: link to :http:get:`/api/1/person/(person_id)/` to get information about the committer of the revision :>json string committer_date: ISO representation of the commit date (in UTC) :>json string date: ISO representation of the revision date (in UTC) :>json string directory: the unique identifier that revision points to :>json string directory_url: link to :http:get:`/api/1/directory/(sha1_git)/[(path)/]` to get information about the directory associated to the revision :>json string id: the revision unique identifier :>json boolean merge: whether or not the revision corresponds to a merge commit :>json string message: the message associated to the revision :>json array parents: the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to :http:get:`/api/1/revision/(sha1_git)/` to get more information about it :>json string type: the type of the revision **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options` :statuscode 200: no error - :statuscode 400: an invalid *sha1_git* value has been provided - :statuscode 404: requested revision can not be found in the SWH archive + :statuscode 400: an invalid **sha1_git** value has been provided + :statuscode 404: requested revision can not be found in the archive **Request:** .. parsed-literal:: $ curl -i :swh_web_api:`revision/aafb16d69fd30ff58afdd69036a26047f3aebdc6/` """ class APIDocTestCase(SWHWebTestCase, APITestCase): def test_apidoc_nodoc_failure(self): with self.assertRaises(Exception): @api_doc('/my/nodoc/url/') def apidoc_nodoc_tester(request, arga=0, argb=0): return Response(arga + argb) @staticmethod @api_route(r'/some/(?P[0-9]+)/(?P[0-9]+)/', 'some-doc-route') @api_doc('/some/doc/route/') def apidoc_route(request, myarg, myotherarg, akw=0): """ Sample doc """ return {'result': int(myarg) + int(myotherarg) + akw} def test_apidoc_route_doc(self): # when rv = self.client.get('/api/1/some/doc/route/') # then self.assertEqual(rv.status_code, 200) self.assertTemplateUsed('api/apidoc.html') def test_apidoc_route_fn(self): # when rv = self.client.get('/api/1/some/1/1/') # then self.assertEqual(rv.status_code, 200) @staticmethod @api_route(r'/some/full/(?P[0-9]+)/(?P[0-9]+)/', 'some-complete-doc-route') @api_doc('/some/complete/doc/route/') def apidoc_full_stack(request, myarg, myotherarg, akw=0): """ Sample doc """ return {'result': int(myarg) + int(myotherarg) + akw} def test_apidoc_full_stack_doc(self): # when rv = self.client.get('/api/1/some/complete/doc/route/') # then self.assertEqual(rv.status_code, 200) self.assertTemplateUsed('api/apidoc.html') def test_apidoc_full_stack_fn(self): # when rv = self.client.get('/api/1/some/full/1/1/') # then self.assertEqual(rv.status_code, 200) def test_api_doc_parse_httpdomain(self): doc_data = { 'description': '', 'urls': [], 'args': [], 'params': [], 'resheaders': [], 'reqheaders': [], 'return_type': '', 'returns': [], 'status_codes': [], 'examples': [] } _parse_httpdomain_doc(httpdomain_doc, doc_data) expected_urls = [{ 'rule': '/api/1/revision/ **\\(sha1_git\\)** /', 'methods': ['GET', 'HEAD', 'OPTIONS'] }] self.assertIn('urls', doc_data) self.assertEqual(doc_data['urls'], expected_urls) - expected_description = 'Get information about a revision in the SWH archive. \ -Revisions are identified by *sha1* checksums, compatible with Git commit \ + expected_description = 'Get information about a revision in the archive. \ +Revisions are identified by **sha1** checksums, compatible with Git commit \ identifiers. See **swh.model.identifiers.revision_identifier** in our data \ model module for details about how they are computed.' self.assertIn('description', doc_data) self.assertEqual(doc_data['description'], expected_description) expected_args = [{ 'name': 'sha1_git', 'type': 'string', - 'doc': 'hexadecimal representation of the revision *sha1_git* identifier' + 'doc': 'hexadecimal representation of the revision **sha1_git** identifier' }] self.assertIn('args', doc_data) self.assertEqual(doc_data['args'], expected_args) expected_params = [] self.assertIn('params', doc_data) self.assertEqual(doc_data['params'], expected_params) expected_reqheaders = [{ - 'doc': 'the requested response content type, either *application/json* or *application/yaml*', + 'doc': 'the requested response content type, either ``application/json`` or ``application/yaml``', 'name': 'Accept' }] self.assertIn('reqheaders', doc_data) self.assertEqual(doc_data['reqheaders'], expected_reqheaders) expected_resheaders = [{ 'doc': 'this depends on **Accept** header of request', 'name': 'Content-Type' }] self.assertIn('resheaders', doc_data) self.assertEqual(doc_data['resheaders'], expected_resheaders) expected_statuscodes = [ { 'code': '200', 'doc': 'no error' }, { 'code': '400', - 'doc': 'an invalid *sha1_git* value has been provided' + 'doc': 'an invalid **sha1_git** value has been provided' }, { 'code': '404', - 'doc': 'requested revision can not be found in the SWH archive' + 'doc': 'requested revision can not be found in the archive' } ] self.assertIn('status_codes', doc_data) self.assertEqual(doc_data['status_codes'], expected_statuscodes) expected_return_type = 'object' self.assertIn('return_type', doc_data) self.assertEqual(doc_data['return_type'], expected_return_type) expected_returns = [ { 'name': 'author', 'type': 'object', 'doc': 'information about the author of the revision' }, { 'name': 'author_url', 'type': 'string', 'doc': 'link to ``_ to get information about the author of the revision' }, { 'name': 'committer', 'type': 'object', 'doc': 'information about the committer of the revision' }, { 'name': 'committer_url', 'type': 'string', 'doc': 'link to ``_ to get information about the committer of the revision' }, { 'name': 'committer_date', 'type': 'string', 'doc': 'ISO representation of the commit date (in UTC)' }, { 'name': 'date', 'type': 'string', 'doc': 'ISO representation of the revision date (in UTC)' }, { 'name': 'directory', 'type': 'string', 'doc': 'the unique identifier that revision points to' }, { 'name': 'directory_url', 'type': 'string', 'doc': 'link to ``_ to get information about the directory associated to the revision' }, { 'name': 'id', 'type': 'string', 'doc': 'the revision unique identifier' }, { 'name': 'merge', 'type': 'boolean', 'doc': 'whether or not the revision corresponds to a merge commit' }, { 'name': 'message', 'type': 'string', 'doc': 'the message associated to the revision' }, { 'name': 'parents', 'type': 'array', 'doc': 'the parents of the revision, i.e. the previous revisions that head directly to it, each entry of that array contains an unique parent revision identifier but also a link to ``_ to get more information about it' }, { 'name': 'type', 'type': 'string', 'doc': 'the type of the revision' } ] self.assertIn('returns', doc_data) self.assertEqual(doc_data['returns'], expected_returns) expected_examples = ['/api/1/revision/aafb16d69fd30ff58afdd69036a26047f3aebdc6/'] self.assertIn('examples', doc_data) self.assertEqual(doc_data['examples'], expected_examples) diff --git a/swh/web/tests/api/views/test_origin.py b/swh/web/tests/api/views/test_origin.py index a59acc98..6950e4e6 100644 --- a/swh/web/tests/api/views/test_origin.py +++ b/swh/web/tests/api/views/test_origin.py @@ -1,246 +1,246 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from rest_framework.test import APITestCase from unittest.mock import patch from swh.storage.exc import StorageDBError, StorageAPIError from swh.web.tests.testcase import SWHWebTestCase class OriginApiTestCase(SWHWebTestCase, APITestCase): def setUp(self): self.origin_visit1 = { 'date': 1104616800.0, 'origin': 10, 'visit': 100, 'metadata': None, 'status': 'full', } self.origin1 = { 'id': 1234, 'url': 'ftp://some/url/to/origin/0', 'type': 'ftp' } @patch('swh.web.api.views.origin.get_origin_visits') def test_api_1_lookup_origin_visits_raise_error( self, mock_get_origin_visits, ): # given mock_get_origin_visits.side_effect = ValueError( 'voluntary error to check the bad request middleware.') # when rv = self.client.get('/api/1/origin/2/visits/') # then self.assertEqual(rv.status_code, 400) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'ValueError', 'reason': 'voluntary error to check the bad request middleware.'}) @patch('swh.web.common.utils.service') def test_api_1_lookup_origin_visits_raise_swh_storage_error_db( self, mock_service): # given mock_service.lookup_origin_visits.side_effect = StorageDBError( - 'SWH Storage exploded! Will be back online shortly!') + 'Storage exploded! Will be back online shortly!') # when rv = self.client.get('/api/1/origin/2/visits/') # then self.assertEqual(rv.status_code, 503) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'StorageDBError', 'reason': 'An unexpected error occurred in the backend: ' - 'SWH Storage exploded! Will be back online shortly!'}) + 'Storage exploded! Will be back online shortly!'}) @patch('swh.web.common.utils.service') def test_api_1_lookup_origin_visits_raise_swh_storage_error_api( self, mock_service): # given mock_service.lookup_origin_visits.side_effect = StorageAPIError( - 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' + 'Storage API dropped dead! Will resurrect from its ashes asap!' ) # when rv = self.client.get('/api/1/origin/2/visits/') # then self.assertEqual(rv.status_code, 503) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'StorageAPIError', 'reason': 'An unexpected error occurred in the api backend: ' - 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' + 'Storage API dropped dead! Will resurrect from its ashes asap!' }) @patch('swh.web.api.views.origin.get_origin_visits') def test_api_1_lookup_origin_visits(self, mock_get_origin_visits): # given stub_visits = [ { 'date': 1293919200.0, 'origin': 2, 'snapshot': '1234', 'visit': 1 }, { 'date': 1293919200.0, 'origin': 2, 'snapshot': '1234', 'visit': 2 }, { 'date': 1420149600.0, 'origin': 2, 'snapshot': '5678', 'visit': 3 }, { 'date': 1420149600.0, 'origin': 2, 'snapshot': '5678', 'visit': 4 } ] mock_get_origin_visits.return_value = stub_visits # when rv = self.client.get('/api/1/origin/2/visits/?per_page=2&last_visit=3') self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, [ { 'date': 1293919200.0, 'origin': 2, 'snapshot': '1234', 'visit': 2, 'origin_visit_url': '/api/1/origin/2/visit/2/', 'snapshot_url': '/api/1/snapshot/1234/' }, { 'date': 1293919200.0, 'origin': 2, 'snapshot': '1234', 'visit': 1, 'origin_visit_url': '/api/1/origin/2/visit/1/', 'snapshot_url': '/api/1/snapshot/1234/' }, ]) @patch('swh.web.api.views.origin.service') def test_api_1_lookup_origin_visit(self, mock_service): # given origin_visit = self.origin_visit1.copy() origin_visit.update({ 'snapshot': '57478754' }) mock_service.lookup_origin_visit.return_value = origin_visit expected_origin_visit = self.origin_visit1.copy() expected_origin_visit.update({ 'origin_url': '/api/1/origin/10/', 'snapshot': '57478754', 'snapshot_url': '/api/1/snapshot/57478754/' }) # when rv = self.client.get('/api/1/origin/10/visit/100/') self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_origin_visit) mock_service.lookup_origin_visit.assert_called_once_with('10', '100') @patch('swh.web.api.views.origin.service') def test_api_1_lookup_origin_visit_not_found(self, mock_service): # given mock_service.lookup_origin_visit.return_value = None # when rv = self.client.get('/api/1/origin/1/visit/1000/') self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', 'reason': 'No visit 1000 for origin 1 found' }) mock_service.lookup_origin_visit.assert_called_once_with('1', '1000') @patch('swh.web.api.views.origin.service') def test_api_origin_by_id(self, mock_service): # given mock_service.lookup_origin.return_value = self.origin1 expected_origin = self.origin1.copy() expected_origin.update({ 'origin_visits_url': '/api/1/origin/1234/visits/' }) # when rv = self.client.get('/api/1/origin/1234/') # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_origin) mock_service.lookup_origin.assert_called_with({'id': '1234'}) @patch('swh.web.api.views.origin.service') def test_api_origin_by_type_url(self, mock_service): # given stub_origin = self.origin1.copy() stub_origin.update({ 'id': 987 }) mock_service.lookup_origin.return_value = stub_origin expected_origin = stub_origin.copy() expected_origin.update({ 'origin_visits_url': '/api/1/origin/987/visits/' }) # when rv = self.client.get('/api/1/origin/ftp/url' '/ftp://some/url/to/origin/0/') # then self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, expected_origin) mock_service.lookup_origin.assert_called_with( {'url': 'ftp://some/url/to/origin/0', 'type': 'ftp'}) @patch('swh.web.api.views.origin.service') def test_api_origin_not_found(self, mock_service): # given mock_service.lookup_origin.return_value = None # when rv = self.client.get('/api/1/origin/4321/') # then self.assertEqual(rv.status_code, 404) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'NotFoundExc', 'reason': 'Origin with id 4321 not found.' }) mock_service.lookup_origin.assert_called_with({'id': '4321'}) diff --git a/swh/web/tests/api/views/test_stat.py b/swh/web/tests/api/views/test_stat.py index 5e179c33..afe9b975 100644 --- a/swh/web/tests/api/views/test_stat.py +++ b/swh/web/tests/api/views/test_stat.py @@ -1,90 +1,90 @@ # Copyright (C) 2015-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from rest_framework.test import APITestCase from unittest.mock import patch from swh.storage.exc import StorageDBError, StorageAPIError from swh.web.tests.testcase import SWHWebTestCase class StatApiTestCase(SWHWebTestCase, APITestCase): @patch('swh.web.api.views.stat.service') def test_api_1_stat_counters_raise_error(self, mock_service): # given mock_service.stat_counters.side_effect = ValueError( 'voluntary error to check the bad request middleware.') # when rv = self.client.get('/api/1/stat/counters/') # then self.assertEqual(rv.status_code, 400) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'ValueError', 'reason': 'voluntary error to check the bad request middleware.'}) @patch('swh.web.api.views.stat.service') def test_api_1_stat_counters_raise_from_db(self, mock_service): # given mock_service.stat_counters.side_effect = StorageDBError( - 'SWH Storage exploded! Will be back online shortly!') + 'Storage exploded! Will be back online shortly!') # when rv = self.client.get('/api/1/stat/counters/') # then self.assertEqual(rv.status_code, 503) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'StorageDBError', 'reason': 'An unexpected error occurred in the backend: ' - 'SWH Storage exploded! Will be back online shortly!'}) + 'Storage exploded! Will be back online shortly!'}) @patch('swh.web.api.views.stat.service') def test_api_1_stat_counters_raise_from_api(self, mock_service): # given mock_service.stat_counters.side_effect = StorageAPIError( - 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' + 'Storage API dropped dead! Will resurrect from its ashes asap!' ) # when rv = self.client.get('/api/1/stat/counters/') # then self.assertEqual(rv.status_code, 503) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { 'exception': 'StorageAPIError', 'reason': 'An unexpected error occurred in the api backend: ' - 'SWH Storage API dropped dead! Will resurrect from its ashes asap!' + 'Storage API dropped dead! Will resurrect from its ashes asap!' }) @patch('swh.web.api.views.stat.service') def test_api_1_stat_counters(self, mock_service): # given stub_stats = { "content": 1770830, "directory": 211683, "directory_entry_dir": 209167, "directory_entry_file": 1807094, "directory_entry_rev": 0, "entity": 0, "entity_history": 0, "origin": 1096, "person": 0, "release": 8584, "revision": 7792, "revision_history": 0, "skipped_content": 0 } mock_service.stat_counters.return_value = stub_stats # when rv = self.client.get('/api/1/stat/counters/') self.assertEqual(rv.status_code, 200) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, stub_stats) mock_service.stat_counters.assert_called_once_with() diff --git a/swh/web/tests/browse/test_utils.py b/swh/web/tests/browse/test_utils.py index a03b4182..903e834c 100644 --- a/swh/web/tests/browse/test_utils.py +++ b/swh/web/tests/browse/test_utils.py @@ -1,244 +1,244 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information # flake8: noqa from unittest.mock import patch from swh.web.browse import utils from swh.web.common.exc import NotFoundExc from swh.web.common.utils import reverse from swh.web.tests.testcase import SWHWebTestCase from .views.data.revision_test_data import revision_history_log_test class SwhBrowseUtilsTestCase(SWHWebTestCase): def test_get_mimetype_and_encoding_for_content(self): text = b'Hello world!' self.assertEqual(utils.get_mimetype_and_encoding_for_content(text), ('text/plain', 'us-ascii')) @patch('swh.web.browse.utils.get_origin_visits') def test_get_origin_visit(self, mock_origin_visits): origin_info = { 'id': 2, 'type': 'git', 'url': 'https://github.com/foo/bar', } visits = \ [{'status': 'full', 'date': '2015-07-09T21:09:24+00:00', 'visit': 1, 'origin': origin_info['id'] }, {'status': 'full', 'date': '2016-02-23T18:05:23.312045+00:00', 'visit': 2, 'origin': origin_info['id'] }, {'status': 'full', 'date': '2016-03-28T01:35:06.554111+00:00', 'visit': 3, 'origin': origin_info['id'] }, {'status': 'full', 'date': '2016-06-18T01:22:24.808485+00:00', 'visit': 4, 'origin': origin_info['id'] }, {'status': 'full', 'date': '2016-08-14T12:10:00.536702+00:00', 'visit': 5, 'origin': origin_info['id'] }] mock_origin_visits.return_value = visits visit_id = 12 with self.assertRaises(NotFoundExc) as cm: visit = utils.get_origin_visit(origin_info, visit_id=visit_id) exception_text = cm.exception.args[0] self.assertIn('Visit with id %s' % visit_id, exception_text) self.assertIn('type %s' % origin_info['type'], exception_text) self.assertIn('url %s' % origin_info['url'], exception_text) visit = utils.get_origin_visit(origin_info, visit_id=2) self.assertEqual(visit, visits[1]) visit = utils.get_origin_visit( origin_info, visit_ts='2016-02-23T18:05:23.312045+00:00') self.assertEqual(visit, visits[1]) visit = utils.get_origin_visit( origin_info, visit_ts='2016-02-20') self.assertEqual(visit, visits[1]) visit = utils.get_origin_visit( origin_info, visit_ts='2016-06-18T01:22') self.assertEqual(visit, visits[3]) visit = utils.get_origin_visit( origin_info, visit_ts='2016-06-18 01:22') self.assertEqual(visit, visits[3]) visit = utils.get_origin_visit( origin_info, visit_ts=1466208000) self.assertEqual(visit, visits[3]) visit = utils.get_origin_visit( origin_info, visit_ts='2014-01-01') self.assertEqual(visit, visits[0]) visit = utils.get_origin_visit( origin_info, visit_ts='2018-01-01') self.assertEqual(visit, visits[-1]) @patch('swh.web.browse.utils.service') @patch('swh.web.browse.utils.get_origin_visit') def test_get_origin_visit_snapshot(self, mock_get_origin_visit, mock_service): mock_get_origin_visit.return_value = \ {'status': 'full', 'date': '2015-08-04T22:26:14.804009+00:00', 'visit': 1, 'origin': 1, 'snapshot': '584b2fe3ce6218a96892e73bd76c2966bbc2a797'} mock_service.lookup_snapshot.return_value = \ {'branches': { 'HEAD': { 'target': '9fbd21adbac36be869514e82e2e98505dc47219c', 'target_type': 'revision', 'target_url': '/api/1/revision/9fbd21adbac36be869514e82e2e98505dc47219c/' }, 'refs/heads/master': { 'target': '9fbd21adbac36be869514e82e2e98505dc47219c', 'target_type': 'revision', 'target_url': '/api/1/revision/9fbd21adbac36be869514e82e2e98505dc47219c/' }, 'refs/tags/0.10.0': { 'target': '7045404f3d1c54e6473c71bbb716529fbad4be24', 'target_type': 'release', 'target_url': '/api/1/release/7045404f3d1c54e6473c71bbb716529fbad4be24/' }, 'refs/tags/0.10.1': { 'target': 'c893f4549c367e68288b0eb74595050410aa0de7', 'target_type': 'release', 'target_url': '/api/1/release/c893f4549c367e68288b0eb74595050410aa0de7/' } }, 'id': '584b2fe3ce6218a96892e73bd76c2966bbc2a797'} mock_service.lookup_release_multiple.return_value = \ [{'name': '0.10.0', 'message': '0.10: The "Oh fuck it\'s PyCon" release\n', 'id': '7045404f3d1c54e6473c71bbb716529fbad4be24', 'date': '2014-04-10T23:01:28-04:00', 'target_type': 'revision', 'target': '6072557b6c10cd9a21145781e26ad1f978ed14b9'}, {'name': '0.10.1', 'message': 'Tagging 0.10.1\n', 'id': 'c893f4549c367e68288b0eb74595050410aa0de7', 'date': '2014-10-10T09:45:52-04:00', 'target_type': 'revision', 'target': 'ecc003b43433e5b46511157598e4857a761007bf'}] mock_service.lookup_revision_multiple.return_value = \ [{'date': '2015-08-04T13:16:54+03:00', 'directory': '828da2b80e41aa958b2c98526f4a1d2cc7d298b7', 'id': '9fbd21adbac36be869514e82e2e98505dc47219c', 'message': 'Merge pull request #678 from algernon'}, {'date': '2014-04-10T23:01:11-04:00', 'directory': '2df4cd84ecc65b50b1d5318d3727e02a39b8a4cf', 'id': '6072557b6c10cd9a21145781e26ad1f978ed14b9', 'message': '0.10: The "Oh fuck it\'s PyCon" release\n'}, {'date': '2014-10-10T09:45:23-04:00', 'directory': '28ba64f97ef709e54838ae482c2da2619a74a0bd', 'id': 'ecc003b43433e5b46511157598e4857a761007bf', 'message': '0.10.1\n'}] expected_result = ( [{'name': 'HEAD', 'message': 'Merge pull request #678 from algernon', 'date': '04 August 2015, 10:16 UTC', 'revision': '9fbd21adbac36be869514e82e2e98505dc47219c', 'directory': '828da2b80e41aa958b2c98526f4a1d2cc7d298b7'}, {'name': 'refs/heads/master', 'message': 'Merge pull request #678 from algernon', 'date': '04 August 2015, 10:16 UTC', 'revision': '9fbd21adbac36be869514e82e2e98505dc47219c', 'directory': '828da2b80e41aa958b2c98526f4a1d2cc7d298b7'}], [{'name': '0.10.0', 'branch_name': 'refs/tags/0.10.0', 'id': '7045404f3d1c54e6473c71bbb716529fbad4be24', 'message': '0.10: The "Oh fuck it\'s PyCon" release\n', 'date': '11 April 2014, 03:01 UTC', 'target_type': 'revision', 'target': '6072557b6c10cd9a21145781e26ad1f978ed14b9', 'directory': '2df4cd84ecc65b50b1d5318d3727e02a39b8a4cf'}, {'name': '0.10.1', 'branch_name': 'refs/tags/0.10.1', 'id': 'c893f4549c367e68288b0eb74595050410aa0de7', 'message': 'Tagging 0.10.1\n', 'date': '10 October 2014, 13:45 UTC', 'target_type': 'revision', 'target': 'ecc003b43433e5b46511157598e4857a761007bf', 'directory': '28ba64f97ef709e54838ae482c2da2619a74a0bd'}] ) origin_info = { 'id': 1, 'type': 'git', 'url': 'https://github.com/hylang/hy' } origin_visit_branches = \ utils.get_origin_visit_snapshot(origin_info, visit_id=1) lookup_release_calls = mock_service.lookup_release_multiple.call_args_list self.assertEqual(len(lookup_release_calls), 1) # Check that we looked up the two expected releases self.assertCountEqual(set(lookup_release_calls[0][0][0]), { '7045404f3d1c54e6473c71bbb716529fbad4be24', 'c893f4549c367e68288b0eb74595050410aa0de7', }) lookup_revision_calls = mock_service.lookup_revision_multiple.call_args_list self.assertEqual(len(lookup_revision_calls), 1) # Check that we looked up the three expected revisions self.assertCountEqual(set(lookup_revision_calls[0][0][0]), { '9fbd21adbac36be869514e82e2e98505dc47219c', '6072557b6c10cd9a21145781e26ad1f978ed14b9', 'ecc003b43433e5b46511157598e4857a761007bf', }) self.assertEqual(origin_visit_branches, expected_result) def test_gen_link(self): - self.assertEqual(utils.gen_link('https://www.softwareheritage.org/', 'SWH'), - 'SWH') + self.assertEqual(utils.gen_link('https://www.softwareheritage.org/', 'swh'), + 'swh') def test_gen_person_link(self): person_id = 8221896 person_name = 'Antoine Lambert' person_url = reverse('browse-person', url_args={'person_id': person_id}) self.assertEqual(utils.gen_person_link(person_id, person_name), '%s' % (person_url, person_name)) def test_gen_revision_link(self): revision_id = '28a0bc4120d38a394499382ba21d6965a67a3703' revision_url = reverse('browse-revision', url_args={'sha1_git': revision_id}) self.assertEqual(utils.gen_revision_link(revision_id), '%s' % (revision_url, revision_id)) self.assertEqual(utils.gen_revision_link(revision_id, shorten_id=True), '%s' % (revision_url, revision_id[:7])) diff --git a/swh/web/tests/browse/views/test_content.py b/swh/web/tests/browse/views/test_content.py index 44dd7121..96a44455 100644 --- a/swh/web/tests/browse/views/test_content.py +++ b/swh/web/tests/browse/views/test_content.py @@ -1,315 +1,326 @@ # Copyright (C) 2017-2018 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import base64 from unittest.mock import patch from django.utils.html import escape from django.utils.encoding import DjangoUnicodeDecodeError from swh.web.browse.utils import get_mimetype_and_encoding_for_content from swh.web.common.exc import NotFoundExc from swh.web.common.utils import reverse, get_swh_persistent_id from swh.web.common.utils import gen_path_info from swh.web.tests.testcase import SWHWebTestCase from .data.content_test_data import ( stub_content_text_data, stub_content_text_path_with_root_dir, stub_content_bin_data, stub_content_bin_filename, stub_content_text_no_highlight_data, non_utf8_encoded_content_data, non_utf8_encoded_content, non_utf8_encoding, stub_content_too_large_data ) class SwhBrowseContentTest(SWHWebTestCase): @patch('swh.web.browse.views.content.request_content') def test_content_view_text(self, mock_request_content): mock_request_content.return_value = stub_content_text_data sha1_git = stub_content_text_data['checksums']['sha1_git'] url = reverse('browse-content', url_args={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa url_raw = reverse('browse-content-raw', url_args={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/content.html') self.assertContains(resp, '') self.assertContains(resp, escape(stub_content_text_data['raw_data'])) self.assertContains(resp, url_raw) swh_cnt_id = get_swh_persistent_id('content', sha1_git) swh_cnt_id_url = reverse('browse-swh-id', url_args={'swh_id': swh_cnt_id}) self.assertContains(resp, swh_cnt_id) self.assertContains(resp, swh_cnt_id_url) @patch('swh.web.browse.views.content.request_content') def test_content_view_text_no_highlight(self, mock_request_content): mock_request_content.return_value = stub_content_text_no_highlight_data sha1_git = stub_content_text_no_highlight_data['checksums']['sha1_git'] url = reverse('browse-content', url_args={'query_string': stub_content_text_no_highlight_data['checksums']['sha1']}) # noqa url_raw = reverse('browse-content-raw', url_args={'query_string': stub_content_text_no_highlight_data['checksums']['sha1']}) # noqa resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/content.html') self.assertContains(resp, '') self.assertContains(resp, escape(stub_content_text_no_highlight_data['raw_data'])) # noqa self.assertContains(resp, url_raw) swh_cnt_id = get_swh_persistent_id('content', sha1_git) swh_cnt_id_url = reverse('browse-swh-id', url_args={'swh_id': swh_cnt_id}) self.assertContains(resp, swh_cnt_id) self.assertContains(resp, swh_cnt_id_url) @patch('swh.web.browse.utils.service') def test_content_view_no_utf8_text(self, mock_service): mock_service.lookup_content.return_value = \ non_utf8_encoded_content_data mock_service.lookup_content_raw.return_value = \ {'data': non_utf8_encoded_content} mock_service.lookup_content_filetype.return_value = None mock_service.lookup_content_language.return_value = None mock_service.lookup_content_license.return_value = None sha1_git = non_utf8_encoded_content_data['checksums']['sha1_git'] url = reverse('browse-content', url_args={'query_string': non_utf8_encoded_content_data['checksums']['sha1']}) # noqa try: resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/content.html') swh_cnt_id = get_swh_persistent_id('content', sha1_git) swh_cnt_id_url = reverse('browse-swh-id', url_args={'swh_id': swh_cnt_id}) self.assertContains(resp, swh_cnt_id_url) self.assertContains(resp, escape(non_utf8_encoded_content.decode(non_utf8_encoding).encode('utf-8'))) # noqa except DjangoUnicodeDecodeError: self.fail('Textual content is not encoded in utf-8') @patch('swh.web.browse.views.content.request_content') def test_content_view_image(self, mock_request_content): mime_type = 'image/png' mock_request_content.return_value = stub_content_bin_data url = reverse('browse-content', url_args={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa url_raw = reverse('browse-content-raw', url_args={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/content.html') png_encoded = base64.b64encode(stub_content_bin_data['raw_data']) \ .decode('utf-8') self.assertContains(resp, '' % (mime_type, png_encoded)) self.assertContains(resp, url_raw) @patch('swh.web.browse.views.content.request_content') def test_content_view_with_path(self, mock_request_content): mock_request_content.return_value = stub_content_text_data url = reverse('browse-content', url_args={'query_string': stub_content_text_data['checksums']['sha1']}, # noqa query_params={'path': stub_content_text_path_with_root_dir}) # noqa resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed('browse/content.html') + self.assertContains(resp, '