diff --git a/.gitignore b/.gitignore
index eca9dd3b7e8f7d95939544640a51468fc64a9397..517220d6014ddfdc95de08f4cb6afb4b8aa9b943 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,4 @@
 .mypy_cache
 node_modules
 
-build/*.js*
-build/app*
\ No newline at end of file
+build/*
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cb692041d37da9237189d49ab50775bf939a6e94..652aa5894bf8ae6dff67d48c176059600c1ae6fd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,9 +2,7 @@ image: node:latest
 
 before_script:
   - npm install
-  - npm install --save-dev webpack
-  - node_modules/.bin/webpack --mode=production
-  - node_modules/.bin/tsc
+  - npm run build
 
 pages:
   script:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9cc32c9aa6ae718e8fbda93591a8e0ce7c0a5874..5a8572c285d581cc3fd684470b6f3224759cf357 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,16 @@
-# RELEASE 0.1 - 28 January 2019
+## RELEASE 0.2 - 24 February 2020
+
+Component rembranded to `pdb-ligand-env`
+
+### Features
+
+* A lot of bug fixes and under the hood improvements
+
+## RELEASE 0.1 - 28 January 2019
 
 First release for public testing.
 
-## Features
+### Features
 
 * Bound molecule interactions view
 * Residue-level interactions view
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..4d3be49506ef5e08cb623a521f986e5750c8ca8c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,153 @@
+# PDB ligand environment component
+
+This is a web-component to display ligand structure in 2D along with its interactions. Ligand can be perceived as a set of covalently linked pdb residues (refered to as bound molecule) or a single pdb residue. This depiction can be enriched with a substructure highlight and binding site interactions.
+
+## Step after cloning (use local server to see demo pages)
+
+```shell
+npm run-script build
+cp demo/demo* build/ (this copies demo_component.html and demo_plugin.html to build folder)
+cd build
+python3 -m http.server
+```
+
+## Component modes
+
+* Mode A: Display bound molecule and its interactions
+* Mode B: Display ligand and its interactions
+* Mode C: Display ligand (chemical component) only
+
+| Mode A | Mode B | Mode C |
+|:------------------: | :-------: | :-------: |
+| <img src="https://www.ebi.ac.uk/~lpravda/imgs/1cbs_REA_200_A.png"/>| <img src="https://www.ebi.ac.uk/~lpravda/imgs/3d12_bm1.png"/> | <img src="https://www.ebi.ac.uk/pdbe-srv/pdbechem/image/showNew?code=VIA&size=500"/> |
+| [1cbs REA 200 A](https://www.ebi.ac.uk/pdbe/entry/pdb/1cbs/bound/REA) | 3D12 bm1 (`2xGLC-2xBGC-LXZ-NGA-GL0`)| [wwPDB CCD - VIA](https://pdbe.org/chem/VIA)
+
+## How to use it
+
+The component can be inserted into the pages by two different ways. Either as a `web-component` using html tag, or directly by using javascript as a `plugin`.
+
+### Web-component
+
+A few files needs to be imported in the page before the component is attempted to be loaded:
+
+```html
+
+<!-- D3 -->
+<script src="https://d3js.org/d3.v5.min.js"></script>
+
+<!-- CSS style to be used for scene drawing (required for saving SVGs.) -->
+<link rel="stylesheet" href="pdb-ligand-env-svg.css" />
+
+<!-- UI icons -->
+<link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css" />
+
+<!-- Web component polyfill (only loads what it needs) -->
+<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/webcomponents-lite.js" charset="utf-8"></script>
+<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"
+    charset="utf-8"></script>
+
+<!--PDBe interactions component-->
+<script type="module" src="pdb-ligand-env-component-0.2.0-min.js"></script>
+```
+
+#### A) Ligand interactions
+
+```html
+<pdb-ligand-env pdb-id="1cbs" pdb-res-id="200" pdb-chain-id="A"></pdb-ligand-env>
+```
+
+#### B) Bound molecule interactions
+
+```html
+<pdb-ligand-env pdb-id="3d12" bound-molecule-id="bm1"></pdb-ligand-env>
+```
+
+#### C) Ligand/chemical component
+
+```html
+<pdb-ligand-env pdb-res-name="CLR" zoom-on ></pdb-ligand-env>
+```
+
+The component contains a number of properties that can be set, in order to change data that are being displayed. First you need to define a component on the page:
+
+```html
+
+<pdb-ligand-env id='SIA-component'></pdb-ligand-env>
+```
+
+and then inject data you want to display e.g.:
+
+```javascript
+let chemUrl = `https://www.ebi.ac.uk/pdbe/static/files/pdbechem_v2/SIA/annotation`;
+let interactionsURL = "https://wwwdev.ebi.ac.uk/pdbe/graph-api/pdb/bound_ligand_interactions/4yy1/A/604";
+let component = document.getElementById('SIA-component');
+
+const depiction = await (await fetch(chemUrl)).json();
+const interactionsData = await (await fetch(interactionsURL)).json();
+const atomsToHighlight = ['C10', 'C11', 'O10'];
+
+component.depiction = depiction;
+component.ligandHighlight = atomsToHighlight;
+component.interactions = interactionsData;
+```
+
+### Plugin
+
+The component can be also added to DOM directly from JavaScript. There are some requirements
+
+```html
+
+<!-- D3 -->
+<script src="https://d3js.org/d3.v5.min.js"></script>
+
+<!-- CSS style to be used for scene drawing (required for saving SVGs.) -->
+<link rel="stylesheet" href="pdb-ligand-env-svg.css" />
+
+<!-- UI icons -->
+<link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css" />
+
+<!--PDB ligand environment plugin-->
+<script src="pdb-ligand-env-plugin-min.js"></script>
+<link rel="stylesheet" href="pdb-ligand-env.css" />
+
+```
+
+and then the component can be instantiated as simply as:
+
+```javascript
+let component = document.getElementById('SIA-component');
+let uiParams = {
+    reinitialize: true, // allow reinitialize option in the component menu
+    zoom: true, // allow scene zoom
+    fullScreen: true, // allow allow full screen option in the component menu
+    downloadImage: true, // allow image download from  the component menu
+    downloadData: true, // allow interactions data download from compoment menu
+    center: true, // allow scene centering option from the component menu
+    help: false, // allow help option from the component menu
+    residueLabel: true, // show residue label
+    tooltip: true // show residue tooltip on mouse hover
+};
+
+this.display = new Visualization(this, uiParams);
+
+// to display bound molecule interactions
+this.display.initBoundMoleculeInteractions('3d12', 'bm1');
+// to display ligand interactions
+this.display.initLigandInteractions('1cbs', 200, 'A');
+
+// to display chemical component only
+this.display.initLigandDisplay('HEM');
+````
+
+## Parameters
+
+| Parametr            | Type      | Required | Description |
+|-------------------- | --------- | -------- | -------     |
+| pdb-id              | string    | No       | PDB id of a protein to retrieve interactions from. `(mode A and B only)` |
+| bound-molecule-id   | string    | No       | PDB bound molecule id `(mode A only)` |
+| pdb-res-name        | string    | No       | PDB residue name aka: *auth_comp_id* `(mode C only)`
+| pdb-res-id          | number    | No       | PDB residue id aka: *auth_seq_id* `(mode B only)`
+| pdb-chain-id        | string    | No       | PDB residue chain aka: *auth_asym_id*  `(mode B only)`|
+| substructure        | string[]  | No       | List of atom names to be highlighted on the ligand structure |
+| color               | string    | No       | HEX representation of the color highlight. `(Default: #D3D3D3)` |
+| zoom-on             | boolean   | No       | Allow zoom functionality on the component level. |
diff --git a/build/pdbe-interactions-svgstyles.css b/build/pdbe-interactions-svgstyles.css
deleted file mode 100644
index 4a397dce79a1aaa9b0f3c7e88a34513ee9b05bba..0000000000000000000000000000000000000000
--- a/build/pdbe-interactions-svgstyles.css
+++ /dev/null
@@ -1,148 +0,0 @@
-.svg-shadow-node {
-    stroke-width: 0;
-    fill: white;
-}
-
-.svg-shadow-bond {
-    stroke-width: 15px;
-    stroke: transparent;
-}
-
-.svg-bond {
-    fill: none;
-    fill-rule: evenodd;
-    stroke-linecap: butt;
-    stroke-linejoin: miter;
-    stroke-opacity: 1;
-}
-
-.svg-bond-ligand {
-    stroke-width: 4px;
-    stroke: black;
-}
-
-.svg-bond-electrostatic {
-    stroke-width: 3px;
-    stroke-dasharray: 10 10;
-    stroke: #3F26BF;
-}
-
-.svg-bond-stacking {
-    stroke-width: 3px;
-    stroke: green;
-}
-
-.svg-bond-atom-pi {
-    stroke-width: 3px;
-    stroke: green;
-}
-
-.svg-bond-amide {
-    stroke-width: 3px;
-    stroke: green;
-}
-
-.svg-bond-vdw {
-    stroke-width: 3px;
-    stroke-dasharray: 10 10;
-    stroke: #9B7653;
-}
-
-.svg-bond-hydrophobic {
-    stroke-width: 0px;
-}
-
-.svg-bond-aromatic {
-    stroke-width: 4px;
-    stroke-dasharray: 1 10;
-    stroke: #AD4379;
-}
-
-.svg-bond-metal {
-    stroke-width: 4px;
-    stroke: #008080;
-}
-
-.svg-bond-clashes {
-    stroke-width: 3px;
-    stroke: #FF5050;
-}
-
-.svg-bond-covalent {
-    stroke-width: 3px;
-    stroke: black;
-}
-
-.svg-bond-other {
-    stroke-width: 1px;
-    stroke: black;
-}
-
-.svg-node circle {
-    stroke-width: 3px;
-}
-
-.svg-node text {
-    cursor: inherit;
-    font-family: Arial, Helvetica, sans-serif;
-    stroke: black !important;
-    fill: black !important;
-}
-
-.svg-node text tspan:first-child {
-    cursor: inherit;
-    font-weight: 100;
-    font-size: 0.75em;
-}
-
-.svg-node text tspan:nth-child(2) {
-    cursor: inherit;
-    font-weight: lighter;
-    font-size: 0.55em;
-}
-
-.svg-ligand-res {
-    stroke: black;
-    fill: white;
-}
-
-.svg-water-res {
-    stroke: #A9A9A9;
-    fill: #00BFFF;
-}
-
-.svg-cystein-res {
-    stroke: #A9A9A9;
-    fill: yellow;
-}
-
-.svg-positive-res {
-    stroke: #A9A9A9;
-    fill: #007FFF;
-}
-
-.svg-negative-res {
-    stroke: #A9A9A9;
-    fill: #FF4500;
-}
-
-.svg-polar-res {
-    stroke: #A9A9A9;
-    fill: #9DC183;
-}
-
-.svg-aromatic-res {
-    stroke: #A9A9A9;
-    fill: #FFA2FF;
-}
-
-.svg-aliphatic-res {
-    stroke: #A9A9A9;
-    fill: #808080;
-}
-
-.svg-others-res {
-    stroke: #A9A9A9;
-    fill: #C0C0C0;
-
-}
\ No newline at end of file
diff --git a/demo/demo_component.html b/demo/demo_component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9957b578aa270e3a6b0ec816b2062765c9323a0a
--- /dev/null
+++ b/demo/demo_component.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html lang="en">
+  <head> 
+
+    <script src="https://d3js.org/d3.v5.min.js"></script>    
+    <!-- CSS style to be used for scene drawing (required for saving SVGs.) -->
+    <link rel="stylesheet" href="pdb-ligand-env-svg.css" />    
+    <!-- UI icons -->
+    <link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css" />    
+    <!-- Web component polyfill (only loads what it needs) -->
+    <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/webcomponents-lite.js"
+        charset="utf-8"></script>
+    <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"
+        charset="utf-8"></script>    
+    <!--PDBe interactions component-->
+    <script type="module" src="pdb-ligand-env-component-0.2.0-min.js"></script>
+
+  </head>
+  
+  <body>
+    
+    <!--Mode A-->
+    <div style="position: relative; float: left;">
+      <div style="width: 500px; height: 500px; position: relative">
+        <pdb-ligand-env pdb-id="1cbs" pdb-res-id="200" pdb-chain-id="A"></pdb-ligand-env>
+      </div>
+    </div>
+
+    <!--Mode B-->
+    <div style="position: relative; float: left;">
+      <div style="width: 500px; height: 500px; position: relative">
+        <pdb-ligand-env pdb-id="3d12" bound-molecule-id="bm1"></pdb-ligand-env>
+      </div>
+    </div>
+
+    <!--Mode C-->
+    <div style="position: relative; float: left;">
+        <div style="width: 500px; height: 500px; position: relative">
+          <pdb-ligand-env pdb-res-name="CLR" zoom-on></pdb-ligand-env>
+        </div>
+      </div>
+      
+  </body>
+
+</html>
\ No newline at end of file
diff --git a/demo/demo_plugin.html b/demo/demo_plugin.html
new file mode 100644
index 0000000000000000000000000000000000000000..23621872cd42193df387f55dbe9925f2d302a06c
--- /dev/null
+++ b/demo/demo_plugin.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    
+    <link rel="stylesheet" href="pdb-ligand-env.css" />
+
+    <script src="https://d3js.org/d3.v5.min.js"></script>
+    <!-- CSS style to be used for scene drawing (required for saving SVGs.) -->
+    <link rel="stylesheet" href="pdb-ligand-env-svg.css" />
+    <!-- UI icons -->
+    <link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css" />
+    <!-- Web component polyfill (only loads what it needs) -->
+    <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/webcomponents-lite.js"
+        charset="utf-8"></script>
+    <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"
+        charset="utf-8"></script>
+  
+    <!--PDBe interactions plugin-->
+    <script src="pdb-ligand-env-plugin-min.js"></script>
+    
+    <!--Initialize Visualization-->
+    <script>
+      document.addEventListener("DOMContentLoaded", function (event) {
+        //<!--Mode A-->
+        var eleLigInteraction = document.getElementById('ligand-interaction');
+        this.lidisplay = new Visualization(eleLigInteraction, undefined);
+        this.lidisplay.initLigandInteractions('1cbs', 200, 'A');
+
+        //<!--Mode B-->
+        var eleBoundInteraction = document.getElementById('boundmolecule-interaction');
+        this.bmdisplay = new Visualization(eleBoundInteraction, undefined);
+        this.bmdisplay.initBoundMoleculeInteractions('3d12', 'bm1');
+
+        //<!--Mode C-->
+        var eleChemComp = document.getElementById('chem-comp');
+        this.ccdisplay = new Visualization(eleChemComp, undefined);
+        this.ccdisplay.initLigandDisplay('HEM');
+      });
+    </script>
+
+  </head>
+  <body>  
+    <!--Mode A-->
+    <div style="position: relative; float: left;">
+      <div style="width: 600px; height: 600px; position: relative">
+      <div id='ligand-interaction'></div>
+      </div>
+    </div>
+
+    <!--Mode B-->
+    <div style="position: relative; float: left;">
+      <div style="width: 600px; height: 600px; position: relative">
+      <div id='boundmolecule-interaction'></div>
+    </div>
+
+    <!--Mode C-->
+    <div style="position: relative; float: left;">
+      <div style="width: 600px; height: 600px; position: relative">
+        <div id='chem-comp'></div>
+      </div>
+    </div>
+
+  </body>
+  
+</html>
\ No newline at end of file
diff --git a/build/het_mapping.json b/dependencies/het_mapping.json
similarity index 100%
rename from build/het_mapping.json
rename to dependencies/het_mapping.json
diff --git a/build/index.html b/dependencies/index.html
similarity index 77%
rename from build/index.html
rename to dependencies/index.html
index b919569c7ae0ebb3570b49a3a0079a8d98aee6e8..99eaf8058a6e205198a283f95a9aa730875f0194 100644
--- a/build/index.html
+++ b/dependencies/index.html
@@ -3,8 +3,7 @@
 <script src="https://d3js.org/d3.v5.min.js"></script>
 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
 <!--testing purposes only-->
-<link rel="stylesheet" href="pdbe-interactions-styles.css" />
-<link rel="stylesheet" href="pdbe-interactions-svgstyles.css" />
+<link rel="stylesheet" href="pdb-ligand-env-svg.css" />
 <link rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css" />
 
 <!-- MOL* -->
@@ -12,8 +11,6 @@
     href="https://wwwdev.ebi.ac.uk/pdbe/pdb-component-library/v1.0/css/molstar-light-0.0.1.css">
 <script src="https://wwwdev.ebi.ac.uk/pdbe/pdb-component-library/v1.0/js/molstar-0.0.1.js"></script>
 
-<script src="app.js"></script>
-
 <!-- Web component polyfill (only loads what it needs) -->
 <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/webcomponents-lite.js" charset="utf-8">
 </script>
@@ -21,16 +18,17 @@
 <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"
     charset="utf-8"></script>
 
-<script type="module" src="component.js"></script>
+<script type="module" src="pdb-ligand-env-component-0.2.0-min.js"></script>
 <script>
     var renderBmInteractions = function (id, bmId) {
-        var int = `<pdb-interactions pdb-id="${id}" bound-molecule-id="${bmId}"></pdb-interactions>`
+        var int =
+            `<pdb-ligand-env style="border: 1px solid black" pdb-id="${id}" bound-molecule-id="${bmId}"></pdb-ligand-env>`
         document.getElementById('rt').innerHTML = int;
     };
 
     var renderLigandInteractions = function (id, chain, resId) {
         var int =
-            `<pdb-interactions pdb-id="${id}" pdb-chain-id="${chain}" pdb-res-id="${resId}"></pdb-interactions>`
+            `<pdb-ligand-env style="border: 1px solid black" pdb-id="${id}" pdb-chain-id="${chain}" pdb-res-id="${resId}" zoom-on></pdb-ligand-env>`
         document.getElementById('rt').innerHTML = int;
     };
 
@@ -71,8 +69,6 @@
                         query: "https://wwwdev.ebi.ac.uk/pdbe/coordinates/1cbs/ligandInteraction?&authAsymId=$A&authSeqNumber=$200&radius=5&dataSource=hydrogens"
                     };
                 }
-                console.log('Perceived parameters:');
-                console.log(params);
 
                 if (params.bmid === undefined) {
                     renderLigandInteractions(params.pdbid, params.chain, params.resid);
@@ -94,7 +90,11 @@
                     showPDBeLogo: false,
                     assemblyId: 'preferred', //'deposited'
                     // selectInteraction: false,
-                    ligandView: {auth_asym_Id: params.chain, auth_seq_id: params.resid, hydrogens: true},
+                    ligandView: {
+                        auth_asym_Id: params.chain,
+                        auth_seq_id: params.resid,
+                        hydrogens: true
+                    },
                     backgroundColour: '0xFFFFFF',
                     //customColorList: [0xff0000, 0x0000ff],
                     //representationStyle: representationStyle//,
@@ -112,25 +112,30 @@
 
 <body>
     <div style="position: relative; float: left;">
-        <div id="rt" style="width: 500px; height: 500px; border: 1px solid black; position: relative">
+        <div id="rt" style="width: 500px; height: 500px; position: relative">
         </div>
     </div>
     <div style="position: relative; float: left;">
         <div id='3dViewer' style="position:relative; width: 500px;height: 500px;"></div>
     </div>
-    <!-- <div style="position: relative; float: left;">
-        <div id="rt" style="width: 500px; height: 500px; border: 1px solid black; position: relative">
-            <pdb-interactions pdb-id="3d11" bound-molecule-id="bm1"></pdb-interactions>
-        </div> -->
+    <div style="position: relative; float: left;">
+        <div id="rt 1" style="width: 500px; height: 500px; position: relative">
+            <pdb-ligand-env pdb-id="3d12" bound-molecule-id="bm1" zoom-on></pdb-ligand-env>
+        </div>
+    </div>
+    <div style="position: relative; float: left;">
+        <div id="rt 1" style="width: 500px; height: 500px; position: relative">
+            <pdb-ligand-env pdb-id="2aw3" bound-molecule-id="bm1" zoom-on></pdb-ligand-env>
+        </div>
     </div>
 
     <!--
         Further use in the app for bound molecule interactions:
         
-        <pdb-interactions pdb-id="3d12" bound-molecule-id="bm1"></pdb-interactions>
+        <pdb-ligand-env pdb-id="3d12" bound-molecule-id="bm1"></pdb-ligand-env>
         
         for ligand interactions:
-        <pdb-interactions pdb-id="3d12" pdb-chain-id="A" pdb-res-id="200"></pdb-interactions>
+        <pdb-ligand-env pdb-id="3d12" pdb-chain-id="A" pdb-res-id="200"></pdb-ligand-env>
     -->
     <script>
 
diff --git a/build/visuals.xml b/dependencies/pdb-snfg-visuals.xml
similarity index 52%
rename from build/visuals.xml
rename to dependencies/pdb-snfg-visuals.xml
index 1984d5560f21fed5e75a480f230ce1280f10a6ee..e1bd990bb0ba83abd5d310f24b77da95ea3c9457 100644
--- a/build/visuals.xml
+++ b/dependencies/pdb-snfg-visuals.xml
@@ -2,298 +2,298 @@
   <glycans>
     <!--Hexose-->
     <g name="Glc">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" r="30" />
     </g>
     <g name="Man">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" r="30" />
     </g>
     <g name="Gal">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" r="30" />
     </g>
     <g name="Gul">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" r="30" />
     </g>
     <g name="Alt">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" r="30" />
     </g>
     <g name="All">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" r="30" />
     </g>
     <g name="Tal">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" r="30" />
     </g>
     <g name="Ido">
-      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" r="25" />
+      <circle style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" r="30" />
     </g>
     <!--HexNAc-->
-    <g name="GlcNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
+    <g name="GlcNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
     </g>
-    <g name="ManNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="ManNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="GalNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
+    <g name="GalNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
     </g>
-    <g name="GulNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
+    <g name="GulNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
     </g>
-    <g name="AltNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+    <g name="AltNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
-    <g name="AllNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
+    <g name="AllNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
     </g>
-    <g name="TalNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
+    <g name="TalNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
     </g>
-    <g name="IdoNAc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
+    <g name="IdoNAc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
     </g>
     <!--Hexosamine-->
-    <g name="GlcN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="ManN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#00a651;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="GalN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="GulN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#f47920;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="AltN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="AllN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#a54399;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="TalN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="IdoN" transform="translate(-25,-25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
+    <g name="GlcN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="ManN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#00a651;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="GalN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="GulN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#f47920;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="AltN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="AllN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#a54399;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="TalN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="IdoN" transform="translate(-30,-30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
     </g>
     <!--Hexuronate-->
-    <g name="GlcA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="ManA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#00a651;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="GalA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="GulA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#f47920;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="AltA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="AllA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#a54399;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="TalA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
-    </g>
-    <g name="IdoA" transform="translate(-25,-25) rotate(-45 25 25)">
-      <path style="stroke:none;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" d="M0 0 L50 0 L50 50 Z"/>
-      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 50 L50 50 Z"/>
-      <rect x="0" y="0" width="50" height="50" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
-      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L50 50" />
+    <g name="GlcA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="ManA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#00a651;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="GalA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="GulA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#f47920;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="AltA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="AllA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#a54399;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="TalA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
+    </g>
+    <g name="IdoA" transform="translate(-30,-30) rotate(-45 30 30)">
+      <path style="stroke:none;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" d="M0 0 L60 0 L60 60 Z"/>
+      <path style="stroke:none;fill-rule:nonzero;fill:#ffffff;fill-opacity:1" d="M0 0 L0 60 L60 60 Z"/>
+      <rect x="0" y="0" width="60" height="60" style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;"/>
+      <path style="fill:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L60 60" />
     </g>
     <!--Deoxyhexose-->
-    <g name="Qui" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#0090bc;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="Qui" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#0090bc;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
-    <g name="Rha" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#00a651;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="Rha" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#00a651;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
-    <g name="6dGul" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#f47920;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="6dGul" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#f47920;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
-    <g name="6dAlt" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#f69ea1;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="6dAlt" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#f69ea1;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
-    <g name="6dTal" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#8fcce9;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="6dTal" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#8fcce9;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
-    <g name="Fuc" transform="translate(-25,-25)">
-      <polygon points="25,0 0,50 50,50" style="fill-rule:nonzero;fill:#ed1c24;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="Fuc" transform="translate(-30,-30)">
+      <polygon points="30,0 0,60 60,60" style="fill-rule:nonzero;fill:#ed1c24;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
     <!--DeoxyhexNAc-->
-    <g name="QuiNAc" transform="translate(-25,-25)">
-      <polygon points="25,0 25,50 50,50" style="fill-rule:nonzero;fill:#0090bc;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <polygon points="25,0 50,50 0,50" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <path d="M25 0 L25 50" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-    </g>
-    <g name="RhaNAc" transform="translate(-25,-25)">
-      <polygon points="25,0 25,50 50,50" style="fill-rule:nonzero;fill:#00a651;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <polygon points="25,0 50,50 0,50" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <path d="M25 0 L25 50" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-    </g>
-    <g name="6dAltNAc" transform="translate(-25,-25)">
-      <polygon points="25,0 25,50 50,50" style="fill-rule:nonzero;fill:#f69ea1;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <polygon points="25,0 50,50 0,50" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <path d="M25 0 L25 50" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-    </g>
-    <g name="6dTalNAc" transform="translate(-25,-25)">
-      <polygon points="25,0 25,50 50,50" style="fill-rule:nonzero;fill:#8fcce9;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <polygon points="25,0 50,50 0,50" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <path d="M25 0 L25 50" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-    </g>
-    <g name="FucNAc" transform="translate(-25,-25)">
-      <polygon points="25,0 25,50 50,50" style="fill-rule:nonzero;fill:#ed1c24;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <polygon points="25,0 50,50 0,50" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
-      <path d="M25 0 L25 50" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    <g name="QuiNAc" transform="translate(-30,-30)">
+      <polygon points="30,0 30,60 60,60" style="fill-rule:nonzero;fill:#0090bc;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <polygon points="30,0 60,60 0,60" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <path d="M30 0 L30 60" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    </g>
+    <g name="RhaNAc" transform="translate(-30,-30)">
+      <polygon points="30,0 30,60 60,60" style="fill-rule:nonzero;fill:#00a651;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <polygon points="30,0 60,60 0,60" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <path d="M30 0 L30 60" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    </g>
+    <g name="6dAltNAc" transform="translate(-30,-30)">
+      <polygon points="30,0 30,60 60,60" style="fill-rule:nonzero;fill:#f69ea1;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <polygon points="30,0 60,60 0,60" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <path d="M30 0 L30 60" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    </g>
+    <g name="6dTalNAc" transform="translate(-30,-30)">
+      <polygon points="30,0 30,60 60,60" style="fill-rule:nonzero;fill:#8fcce9;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <polygon points="30,0 60,60 0,60" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <path d="M30 0 L30 60" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+    </g>
+    <g name="FucNAc" transform="translate(-30,-30)">
+      <polygon points="30,0 30,60 60,60" style="fill-rule:nonzero;fill:#ed1c24;fill-opacity:1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <polygon points="30,0 60,60 0,60" style="fill-rule:nonzero;fill:none;fill-opacity:1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
+      <path d="M30 0 L30 60" style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:#000000;stroke-opacity:1;stroke-miterlimit:10;" />
     </g>
     <!--Di-deoxyhexose-->
-    <g name="Oli" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
+    <g name="Oli" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
     </g>
-    <g name="Tyv" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="Tyv" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="Abe" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
+    <g name="Abe" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
     </g>
-    <g name="Par" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+    <g name="Par" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
-    <g name="Dig" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
+    <g name="Dig" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
     </g>
-    <g name="Col" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
+    <g name="Col" transform="translate(-30,-15)">
+      <rect x="0" y="0" width="60" height="30" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
     </g>
     <!--Pentose-->
-    <g name="Ara" transform="translate(-47.5, -50.052)">
-      <polygon points="47.5,18.75 54.75,40.25 77.25,40.25 59.25,53.75 65.75,75.25 47.5,62.5 29.25,75.25 35.75,53.75 17.75,40.25 40.25,40.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="Ara" transform="translate(-57, -60.06)">
+      <polygon points="57.0,22.5 65.7,48.3 92.7,48.3 71.1,64.5 78.9,90.3 57.0,75.0 35.1,90.3 42.9,64.5 21.3,48.3 48.3,48.3" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="Lyx" transform="translate(-47.5, -50.052)">
-      <polygon points="47.5,18.75 54.75,40.25 77.25,40.25 59.25,53.75 65.75,75.25 47.5,62.5 29.25,75.25 35.75,53.75 17.75,40.25 40.25,40.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
+    <g name="Lyx" transform="translate(-57, -60.06)">
+      <polygon points="57.0,22.5 65.7,48.3 92.7,48.3 71.1,64.5 78.9,90.3 57.0,75.0 35.1,90.3 42.9,64.5 21.3,48.3 48.3,48.3" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
     </g>
-    <g name="Xyl" transform="translate(-47.5, -50.052)">
-      <polygon points="47.5,18.75 54.75,40.25 77.25,40.25 59.25,53.75 65.75,75.25 47.5,62.5 29.25,75.25 35.75,53.75 17.75,40.25 40.25,40.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
+    <g name="Xyl" transform="translate(-57, -60.06)">
+      <polygon points="57.0,22.5 65.7,48.3 92.7,48.3 71.1,64.5 78.9,90.3 57.0,75.0 35.1,90.3 42.9,64.5 21.3,48.3 48.3,48.3" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
     </g>
-    <g name="Rib" transform="translate(-47.5, -50.052)">
-      <polygon points="47.5,18.75 54.75,40.25 77.25,40.25 59.25,53.75 65.75,75.25 47.5,62.5 29.25,75.25 35.75,53.75 17.75,40.25 40.25,40.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+    <g name="Rib" transform="translate(-57, -60.06)">
+      <polygon points="57.0,22.5 65.7,48.3 92.7,48.3 71.1,64.5 78.9,90.3 57.0,75.0 35.1,90.3 42.9,64.5 21.3,48.3 48.3,48.3" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
     <!--Deoxynonulosonate-->
-    <g name="Kdn" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="Kdn" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="Neu5Ac" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
+    <g name="Neu5Ac" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
     </g>
-    <g name="Neu5Gc" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
+    <g name="Neu5Gc" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
     </g>
-    <g name="Neu" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
+    <g name="Neu" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
     </g>
-    <g name="Sia" transform="translate(-25,-25)">
-      <rect x="0" y="0" width="50" height="50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ed1c24;fill-opacity:1" />
+    <g name="Sia" transform="translate(-30,-30)">
+      <rect x="0" y="0" width="60" height="60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ed1c24;fill-opacity:1" />
     </g>
     <!--Di-deoxynonulosonate-->
     <g name="Pse" transform="translate(-20.625, -38.25) rotate(90, 20.625,41.25)">
-      <polygon points="20.625,0 0,41.25 20.625,82.5 41.25,41.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+      <polygon points="24.75,0 0,49.5 24.75,99 49.5,49.5" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
     <g name="Leg" transform="translate(-20.625, -38.25) rotate(90, 20.625,41.25)">
-      <polygon points="20.625,0 0,41.25 20.625,82.5 41.25,41.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
+      <polygon points="24.75,0 0,49.5 24.75,99 49.5,49.5" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
     </g>
     <g name="Aci" transform="translate(-20.625, -38.25) rotate(90, 20.625,41.25)">
-      <polygon points="20.625,0 0,41.25 20.625,82.5 41.25,41.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+      <polygon points="24.75,0 0,49.5 24.75,99 49.5,49.5" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
     <g name="4eLeg" transform="translate(-20.625, -38.25) rotate(90, 20.625,41.25)">
-      <polygon points="20.625,0 0,41.25 20.625,82.5 41.25,41.25" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
+      <polygon points="24.75,0 0,49.5 24.75,99 49.5,49.5" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
     </g>
     <!--Unkwnown-->
-    <g name="Bac" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
+    <g name="Bac" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
     </g>
-    <g name="LDmanHep" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="LDmanHep" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="Kdo" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
+    <g name="Kdo" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
     </g>
-    <g name="Dha" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
+    <g name="Dha" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
     </g>
-    <g name="DDmanHep" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+    <g name="DDmanHep" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
-    <g name="MurNAc" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
+    <g name="MurNAc" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a54399;fill-opacity:1" />
     </g>
-    <g name="MurNGc" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
+    <g name="MurNGc" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#8fcce9;fill-opacity:1" />
     </g>
-    <g name="Mur" transform="translate(-18.5,-23)">
-      <polygon points="-15,25 0,0 35,0 50,25 35,50 0,50" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
+    <g name="Mur" transform="translate(-22.2,-27.6)">
+      <polygon points="-18,30 0,0 42,0 60,30 42,60 0,60" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#a17a4d;fill-opacity:1" />
     </g>
     <!--Assigned-->
-    <g name="Api" transform="translate(-25,-25)">
-      <polygon points="25,0 50,18 43,50 8,50 0,18" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
+    <g name="Api" transform="translate(-30,-30)">
+      <polygon points="30,0 60,22 52,60 8,60 0,22" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#0090bc;fill-opacity:1" />
     </g>
-    <g name="Fru" transform="translate(-25,-25)">
-      <polygon points="25,0 50,18 43,50 8,50 0,18" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
+    <g name="Fru" transform="translate(-30,-30)">
+      <polygon points="30,0 60,22 52,60 8,60 0,22" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#00a651;fill-opacity:1" />
     </g>
-    <g name="Tag" transform="translate(-25,-25)">
-      <polygon points="25,0 50,18 43,50 8,50 0,18" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
+    <g name="Tag" transform="translate(-30,-30)">
+      <polygon points="30,0 60,22 52,60 8,60 0,22" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#ffd400;fill-opacity:1" />
     </g>
-    <g name="Sor" transform="translate(-25,-25)">
-      <polygon points="25,0 50,18 43,50 8,50 0,18" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
+    <g name="Sor" transform="translate(-30,-30)">
+      <polygon points="30,0 60,22 52,60 8,60 0,22" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f47920;fill-opacity:1" />
     </g>
-    <g name="Psi" transform="translate(-25,-25)">
-      <polygon points="25,0 50,18 43,50 8,50 0,18" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
+    <g name="Psi" transform="translate(-30,-30)">
+      <polygon points="30,0 60,22 52,60 8,60 0,22" style="stroke:black;stroke-width:3;fill-rule:nonzero;fill:#f69ea1;fill-opacity:1" />
     </g>
   </glycans>
 </root>
diff --git a/gulpfile.js b/gulpfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..83ea7951a492013b2dba53e793dde53ff36bdf4c
--- /dev/null
+++ b/gulpfile.js
@@ -0,0 +1,92 @@
+const gulp = require('gulp');
+const path = require('path');
+const del = require('del');
+const concat = require('gulp-concat');
+const header = require('gulp-header');
+const minify = require("gulp-minify");
+
+const PACKAGE_ROOT_PATH = process.cwd();
+const PKG_JSON = require(path.join(PACKAGE_ROOT_PATH, "package.json"));
+
+const banner = ['/**',
+    ` * ${PKG_JSON.name}`,
+    ` * @version ${PKG_JSON.version}`,
+    ' * @link https://gitlab.ebi.ac.uk/pdbe/web-components/ligand-env',
+    ' * @license Apache 2.0',
+    ' */',
+    ''
+].join('\n');
+
+const license = ['/**',
+    ' * Copyright 2019-2020 Lukas Pravda <lpravda@ebi.ac.uk>',
+    ' * European Bioinformatics Institute (EBI, http://www.ebi.ac.uk/)',
+    ' * European Molecular Biology Laboratory (EMBL, http://www.embl.de/)',
+    ' * Licensed under the Apache License, Version 2.0 (the "License");',
+    ' * you may not use this file except in compliance with the License.',
+    ' * You may obtain a copy of the License at ',
+    ' * http://www.apache.org/licenses/LICENSE-2.0',
+    ' * ',
+    ' * Unless required by applicable law or agreed to in writing, software',
+    ' * distributed under the License is distributed on an "AS IS" BASIS, ',
+    ' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
+    ' * See the License for the specific language governing permissions and ',
+    ' * limitations under the License.',
+    ' */',
+    ''
+].join('\n');
+
+
+gulp.task('clean', function () {
+    return del([`build/${PKG_JSON.name}-component-${PKG_JSON.version}.js`, '!build']);
+});
+
+gulp.task('concatCSS', () => {
+    return gulp.src(['src/styles/pdb-ligand-env-svg.css'])
+        .pipe(concat(`${PKG_JSON.name}-svg.css`))
+        .pipe(header(license, {}))
+        .pipe(header(banner, {}))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('copyIndex', () => {
+    return gulp.src(['dependencies/index.html'])
+        .pipe(concat(`index.html`))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('copyMapping', () => {
+    return gulp.src(['dependencies/het_mapping.json'])
+        .pipe(concat(`het_mapping.json`))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('copyXML', () => {
+    return gulp.src(['dependencies/pdb-snfg-visuals.xml'])
+        .pipe(concat(`pdb-snfg-visuals.xml`))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('concat', () => {
+    return gulp.src([`build/${PKG_JSON.name}-plugin.js`, `build/${PKG_JSON.name}-component-init.js`])
+        .pipe(concat(`${PKG_JSON.name}-component-${PKG_JSON.version}.js`))
+        .pipe(header(license, {}))
+        .pipe(header(banner, {}))
+        .pipe(minify({
+            noSource: true
+        }))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('minifyPlugin', () => {
+    return gulp.src([`build/${PKG_JSON.name}-plugin.js`])
+        .pipe(concat(`${PKG_JSON.name}-plugin.js`))
+        .pipe(header(license, {}))
+        .pipe(header(banner, {}))
+        .pipe(minify({
+            noSource: true
+        }))
+        .pipe(gulp.dest('build/'));
+});
+
+gulp.task('default', gulp.series('clean', 'concat', 'concatCSS',
+    'copyXML', 'copyIndex', 'copyMapping', 'minifyPlugin'));
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 639c1631a773074226c5f0fe77c3fdceaa6afd39..cc0981366d691aaaea4a6d14f7a08f693231775c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,260 +1,294 @@
 {
-  "name": "interactions",
-  "version": "1.0.0",
+  "name": "pdb-ligand-env",
+  "version": "0.2.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "@babel/code-frame": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
-      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+      "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.8.3"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz",
+      "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==",
       "dev": true,
       "requires": {
-        "@babel/highlight": "^7.0.0"
+        "browserslist": "^4.8.2",
+        "invariant": "^2.2.4",
+        "semver": "^5.5.0"
       }
     },
     "@babel/core": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
-      "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.4.4",
-        "@babel/helpers": "^7.4.4",
-        "@babel/parser": "^7.4.5",
-        "@babel/template": "^7.4.4",
-        "@babel/traverse": "^7.4.5",
-        "@babel/types": "^7.4.4",
-        "convert-source-map": "^1.1.0",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
+      "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.8.3",
+        "@babel/helpers": "^7.8.3",
+        "@babel/parser": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
         "json5": "^2.1.0",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.13",
         "resolve": "^1.3.2",
         "semver": "^5.4.1",
         "source-map": "^0.5.0"
       }
     },
     "@babel/generator": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
-      "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz",
+      "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.4.4",
+        "@babel/types": "^7.8.3",
         "jsesc": "^2.5.1",
-        "lodash": "^4.17.11",
-        "source-map": "^0.5.0",
-        "trim-right": "^1.0.1"
+        "lodash": "^4.17.13",
+        "source-map": "^0.5.0"
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
-      "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
+      "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
-      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
+      "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
       "dev": true,
       "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-explode-assignable-expression": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-call-delegate": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
-      "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz",
+      "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz",
+      "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.8.1",
+        "browserslist": "^4.8.2",
+        "invariant": "^2.2.4",
+        "levenary": "^1.1.0",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz",
+      "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/helper-regex": "^7.8.3",
+        "regexpu-core": "^4.6.0"
       }
     },
     "@babel/helper-define-map": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz",
-      "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
+      "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/types": "^7.4.4",
-        "lodash": "^4.17.11"
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "lodash": "^4.17.13"
       }
     },
     "@babel/helper-explode-assignable-expression": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
-      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
+      "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
-      "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+      "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-get-function-arity": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-get-function-arity": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
-      "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+      "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-hoist-variables": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
-      "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
+      "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.4.4"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
-      "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
+      "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
-      "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
+      "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz",
-      "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz",
+      "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/template": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "lodash": "^4.17.11"
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-simple-access": "^7.8.3",
+        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "lodash": "^4.17.13"
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
-      "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
+      "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
-      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
+      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
       "dev": true
     },
     "@babel/helper-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz",
-      "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
+      "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
       "dev": true,
       "requires": {
-        "lodash": "^4.17.11"
+        "lodash": "^4.17.13"
       }
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
+      "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-wrap-function": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-annotate-as-pure": "^7.8.3",
+        "@babel/helper-wrap-function": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz",
-      "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz",
+      "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.0.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/helper-member-expression-to-functions": "^7.8.3",
+        "@babel/helper-optimise-call-expression": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
-      "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
+      "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/template": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-      "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+      "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.4.4"
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helper-wrap-function": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
-      "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
+      "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.2.0"
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/helpers": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz",
-      "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz",
+      "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.4.4",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/highlight": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
-      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
+      "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.0",
@@ -263,520 +297,628 @@
       }
     },
     "@babel/parser": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
-      "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz",
+      "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==",
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
-      "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
+      "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-remap-async-to-generator": "^7.8.3",
+        "@babel/plugin-syntax-async-generators": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0",
-        "@babel/plugin-syntax-async-generators": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
+      "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz",
-      "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
-      "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz",
+      "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-syntax-async-generators": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
-      "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
     "@babel/plugin-syntax-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
-      "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
     "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
-      "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
     "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz",
+      "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
-      "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
+      "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz",
-      "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
+      "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0"
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-remap-async-to-generator": "^7.8.3"
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
-      "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
+      "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz",
-      "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
+      "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "lodash": "^4.17.11"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "lodash": "^4.17.13"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz",
-      "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-define-map": "^7.4.4",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.4.4",
-        "@babel/helper-split-export-declaration": "^7.4.4",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz",
+      "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.8.3",
+        "@babel/helper-define-map": "^7.8.3",
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/helper-optimise-call-expression": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-replace-supers": "^7.8.3",
+        "@babel/helper-split-export-declaration": "^7.8.3",
         "globals": "^11.1.0"
       }
     },
     "@babel/plugin-transform-computed-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
-      "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
+      "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz",
-      "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz",
+      "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
-      "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
+      "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz",
-      "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
+      "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
-      "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
+      "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
-      "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz",
+      "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-function-name": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
-      "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
+      "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
-      "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
+      "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
-      "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
+      "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz",
-      "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz",
+      "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-module-transforms": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz",
-      "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz",
+      "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0"
+        "@babel/helper-module-transforms": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-simple-access": "^7.8.3",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz",
-      "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz",
+      "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-hoist-variables": "^7.8.3",
+        "@babel/helper-module-transforms": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
-      "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz",
+      "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-module-transforms": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
-      "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
+      "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
       "dev": true,
       "requires": {
-        "regexp-tree": "^0.1.6"
+        "@babel/helper-create-regexp-features-plugin": "^7.8.3"
       }
     },
     "@babel/plugin-transform-new-target": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
-      "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
+      "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-object-super": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz",
-      "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
+      "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.1.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-replace-supers": "^7.8.3"
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
-      "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz",
+      "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-call-delegate": "^7.4.4",
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-call-delegate": "^7.8.3",
+        "@babel/helper-get-function-arity": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-property-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
-      "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
+      "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
-      "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz",
+      "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==",
       "dev": true,
       "requires": {
         "regenerator-transform": "^0.14.0"
       }
     },
     "@babel/plugin-transform-reserved-words": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
-      "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
+      "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-runtime": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz",
-      "integrity": "sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz",
+      "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
         "resolve": "^1.8.1",
         "semver": "^5.5.1"
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
-      "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
+      "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
-      "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
+      "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
-      "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
+      "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-regex": "^7.8.3"
       }
     },
     "@babel/plugin-transform-template-literals": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
-      "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
+      "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-annotate-as-pure": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
-      "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz",
+      "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
-      "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
+      "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/preset-env": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
-      "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
-        "@babel/plugin-proposal-json-strings": "^7.2.0",
-        "@babel/plugin-proposal-object-rest-spread": "^7.4.4",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-syntax-async-generators": "^7.2.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-transform-arrow-functions": "^7.2.0",
-        "@babel/plugin-transform-async-to-generator": "^7.4.4",
-        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
-        "@babel/plugin-transform-block-scoping": "^7.4.4",
-        "@babel/plugin-transform-classes": "^7.4.4",
-        "@babel/plugin-transform-computed-properties": "^7.2.0",
-        "@babel/plugin-transform-destructuring": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/plugin-transform-duplicate-keys": "^7.2.0",
-        "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
-        "@babel/plugin-transform-for-of": "^7.4.4",
-        "@babel/plugin-transform-function-name": "^7.4.4",
-        "@babel/plugin-transform-literals": "^7.2.0",
-        "@babel/plugin-transform-member-expression-literals": "^7.2.0",
-        "@babel/plugin-transform-modules-amd": "^7.2.0",
-        "@babel/plugin-transform-modules-commonjs": "^7.4.4",
-        "@babel/plugin-transform-modules-systemjs": "^7.4.4",
-        "@babel/plugin-transform-modules-umd": "^7.2.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
-        "@babel/plugin-transform-new-target": "^7.4.4",
-        "@babel/plugin-transform-object-super": "^7.2.0",
-        "@babel/plugin-transform-parameters": "^7.4.4",
-        "@babel/plugin-transform-property-literals": "^7.2.0",
-        "@babel/plugin-transform-regenerator": "^7.4.5",
-        "@babel/plugin-transform-reserved-words": "^7.2.0",
-        "@babel/plugin-transform-shorthand-properties": "^7.2.0",
-        "@babel/plugin-transform-spread": "^7.2.0",
-        "@babel/plugin-transform-sticky-regex": "^7.2.0",
-        "@babel/plugin-transform-template-literals": "^7.4.4",
-        "@babel/plugin-transform-typeof-symbol": "^7.2.0",
-        "@babel/plugin-transform-unicode-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "browserslist": "^4.6.0",
-        "core-js-compat": "^3.1.1",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz",
+      "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.8.0",
+        "@babel/helper-compilation-targets": "^7.8.3",
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
+        "@babel/plugin-proposal-dynamic-import": "^7.8.3",
+        "@babel/plugin-proposal-json-strings": "^7.8.3",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-proposal-object-rest-spread": "^7.8.3",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-proposal-optional-chaining": "^7.8.3",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
+        "@babel/plugin-syntax-async-generators": "^7.8.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-json-strings": "^7.8.0",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+        "@babel/plugin-syntax-top-level-await": "^7.8.3",
+        "@babel/plugin-transform-arrow-functions": "^7.8.3",
+        "@babel/plugin-transform-async-to-generator": "^7.8.3",
+        "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
+        "@babel/plugin-transform-block-scoping": "^7.8.3",
+        "@babel/plugin-transform-classes": "^7.8.3",
+        "@babel/plugin-transform-computed-properties": "^7.8.3",
+        "@babel/plugin-transform-destructuring": "^7.8.3",
+        "@babel/plugin-transform-dotall-regex": "^7.8.3",
+        "@babel/plugin-transform-duplicate-keys": "^7.8.3",
+        "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
+        "@babel/plugin-transform-for-of": "^7.8.3",
+        "@babel/plugin-transform-function-name": "^7.8.3",
+        "@babel/plugin-transform-literals": "^7.8.3",
+        "@babel/plugin-transform-member-expression-literals": "^7.8.3",
+        "@babel/plugin-transform-modules-amd": "^7.8.3",
+        "@babel/plugin-transform-modules-commonjs": "^7.8.3",
+        "@babel/plugin-transform-modules-systemjs": "^7.8.3",
+        "@babel/plugin-transform-modules-umd": "^7.8.3",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
+        "@babel/plugin-transform-new-target": "^7.8.3",
+        "@babel/plugin-transform-object-super": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.8.3",
+        "@babel/plugin-transform-property-literals": "^7.8.3",
+        "@babel/plugin-transform-regenerator": "^7.8.3",
+        "@babel/plugin-transform-reserved-words": "^7.8.3",
+        "@babel/plugin-transform-shorthand-properties": "^7.8.3",
+        "@babel/plugin-transform-spread": "^7.8.3",
+        "@babel/plugin-transform-sticky-regex": "^7.8.3",
+        "@babel/plugin-transform-template-literals": "^7.8.3",
+        "@babel/plugin-transform-typeof-symbol": "^7.8.3",
+        "@babel/plugin-transform-unicode-regex": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "browserslist": "^4.8.2",
+        "core-js-compat": "^3.6.2",
         "invariant": "^2.2.2",
-        "js-levenshtein": "^1.1.3",
+        "levenary": "^1.1.0",
         "semver": "^5.5.0"
       }
     },
     "@babel/runtime": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz",
-      "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
+      "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
       "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.2"
       }
     },
     "@babel/template": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
-      "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
+      "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/code-frame": "^7.8.3",
+        "@babel/parser": "^7.8.3",
+        "@babel/types": "^7.8.3"
       }
     },
     "@babel/traverse": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
-      "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz",
+      "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.4.4",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/parser": "^7.4.5",
-        "@babel/types": "^7.4.4",
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.8.3",
+        "@babel/helper-function-name": "^7.8.3",
+        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/parser": "^7.8.3",
+        "@babel/types": "^7.8.3",
         "debug": "^4.1.0",
         "globals": "^11.1.0",
-        "lodash": "^4.17.11"
+        "lodash": "^4.17.13"
       }
     },
     "@babel/types": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
-      "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
+      "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
       "dev": true,
       "requires": {
         "esutils": "^2.0.2",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.13",
         "to-fast-properties": "^2.0.0"
       }
     },
+    "@blakeembrey/deque": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz",
+      "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==",
+      "dev": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
     "@types/d3": {
       "version": "5.7.2",
       "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.7.2.tgz",
@@ -1020,11 +1162,40 @@
         "@types/d3-selection": "*"
       }
     },
+    "@types/events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+      "dev": true
+    },
     "@types/geojson": {
       "version": "7946.0.7",
       "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
       "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
     },
+    "@types/glob": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
+      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+      "dev": true,
+      "requires": {
+        "@types/events": "*",
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz",
+      "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==",
+      "dev": true
+    },
     "@webassemblyjs/ast": {
       "version": "1.8.5",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
@@ -1202,9 +1373,9 @@
       }
     },
     "@webcomponents/webcomponentsjs": {
-      "version": "2.2.10",
-      "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.2.10.tgz",
-      "integrity": "sha512-5dzhUhP+h0qMiK0IWb7VNb0OGBoXO3AuI6Qi8t9PoKT50s5L1jv0xnwnLq+cFgPuTB8FLTNP8xIDmyoOsKBy9Q==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.1.tgz",
+      "integrity": "sha512-7jxBb+KoWncKb/JGFyTY40PjV4yRx2zd35ZLuvRP+6WndJDL7X32ZIZ7bN3sSQIl+NzJkCo7chfXJyzn+6WZaQ==",
       "dev": true
     },
     "@xtuc/ieee754": {
@@ -1258,6 +1429,16 @@
       "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
       "dev": true
     },
+    "aggregate-error": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
+      "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
     "ajv": {
       "version": "6.10.0",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
@@ -1282,12 +1463,48 @@
       "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
       "dev": true
     },
+    "ansi-colors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "^0.1.0"
+      }
+    },
+    "ansi-cyan": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+      "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
     "ansi-escapes": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
       "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
       "dev": true
     },
+    "ansi-gray": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-red": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
     "ansi-regex": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -1303,6 +1520,12 @@
         "color-convert": "^1.9.0"
       }
     },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
     "anymatch": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
@@ -1339,12 +1562,27 @@
       "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=",
       "dev": true
     },
+    "append-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+      "dev": true,
+      "requires": {
+        "buffer-equal": "^1.0.0"
+      }
+    },
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
       "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
       "dev": true
     },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+      "dev": true
+    },
     "argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -1360,24 +1598,83 @@
       "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
       "dev": true
     },
+    "arr-filter": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+      "dev": true,
+      "requires": {
+        "make-iterator": "^1.0.0"
+      }
+    },
     "arr-flatten": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
       "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
       "dev": true
     },
+    "arr-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+      "dev": true,
+      "requires": {
+        "make-iterator": "^1.0.0"
+      }
+    },
     "arr-union": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
       "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
       "dev": true
     },
+    "array-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+      "dev": true
+    },
     "array-filter": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
       "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
       "dev": true
     },
+    "array-initial": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+      "dev": true,
+      "requires": {
+        "array-slice": "^1.0.0",
+        "is-number": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        }
+      }
+    },
+    "array-last": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+      "dev": true,
+      "requires": {
+        "is-number": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        }
+      }
+    },
     "array-map": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
@@ -1390,6 +1687,37 @@
       "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
       "dev": true
     },
+    "array-slice": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+      "dev": true
+    },
+    "array-sort": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+      "dev": true,
+      "requires": {
+        "default-compare": "^1.0.0",
+        "get-value": "^2.0.6",
+        "kind-of": "^5.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
@@ -1458,6 +1786,18 @@
       "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
       "dev": true
     },
+    "async-done": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+      "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.2",
+        "process-nextick-args": "^2.0.0",
+        "stream-exhaust": "^1.0.1"
+      }
+    },
     "async-each": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
@@ -1476,6 +1816,15 @@
       "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
       "dev": true
     },
+    "async-settle": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+      "dev": true,
+      "requires": {
+        "async-done": "^1.2.2"
+      }
+    },
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -1556,6 +1905,32 @@
         "pify": "^4.0.1"
       }
     },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+      "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "bach": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+      "dev": true,
+      "requires": {
+        "arr-filter": "^1.1.1",
+        "arr-flatten": "^1.0.1",
+        "arr-map": "^2.0.0",
+        "array-each": "^1.0.0",
+        "array-initial": "^1.0.0",
+        "array-last": "^1.1.1",
+        "async-done": "^1.2.2",
+        "async-settle": "^1.0.0",
+        "now-and-later": "^2.0.0"
+      }
+    },
     "backo2": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
@@ -1882,14 +2257,14 @@
       }
     },
     "browserslist": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz",
-      "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==",
+      "version": "4.8.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz",
+      "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30000971",
-        "electron-to-chromium": "^1.3.137",
-        "node-releases": "^1.1.21"
+        "caniuse-lite": "^1.0.30001017",
+        "electron-to-chromium": "^1.3.322",
+        "node-releases": "^1.1.44"
       }
     },
     "bs-recipes": {
@@ -1923,6 +2298,12 @@
         }
       }
     },
+    "buffer-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+      "dev": true
+    },
     "buffer-from": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -2038,9 +2419,9 @@
       "dev": true
     },
     "caniuse-lite": {
-      "version": "1.0.30000971",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz",
-      "integrity": "sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==",
+      "version": "1.0.30001021",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz",
+      "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==",
       "dev": true
     },
     "chalk": {
@@ -2134,6 +2515,12 @@
         }
       }
     },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
+    },
     "clean-webpack-plugin": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-1.0.1.tgz",
@@ -2169,6 +2556,35 @@
         "wrap-ansi": "^2.0.0"
       }
     },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
+    "clone-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+      "dev": true
+    },
+    "clone-stats": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+      "dev": true
+    },
+    "cloneable-readable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "process-nextick-args": "^2.0.0",
+        "readable-stream": "^2.3.5"
+      }
+    },
     "co": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2181,6 +2597,17 @@
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true
     },
+    "collection-map": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+      "dev": true,
+      "requires": {
+        "arr-map": "^2.0.2",
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -2206,6 +2633,12 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "dev": true
+    },
     "colors": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
@@ -2259,6 +2692,23 @@
         "typedarray": "^0.0.6"
       }
     },
+    "concat-with-sourcemaps": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
     "connect": {
       "version": "3.6.6",
       "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
@@ -2307,9 +2757,9 @@
       "dev": true
     },
     "convert-source-map": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
-      "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
       "dev": true,
       "requires": {
         "safe-buffer": "~5.1.1"
@@ -2341,31 +2791,34 @@
       "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
       "dev": true
     },
+    "copy-props": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
+      "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
+      "dev": true,
+      "requires": {
+        "each-props": "^1.3.0",
+        "is-plain-object": "^2.0.1"
+      }
+    },
     "core-js-compat": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.3.tgz",
-      "integrity": "sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA==",
+      "version": "3.6.4",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz",
+      "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.0",
-        "core-js-pure": "3.1.3",
-        "semver": "^6.1.0"
+        "browserslist": "^4.8.3",
+        "semver": "7.0.0"
       },
       "dependencies": {
         "semver": {
-          "version": "6.1.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
-          "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==",
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
           "dev": true
         }
       }
     },
-    "core-js-pure": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.3.tgz",
-      "integrity": "sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==",
-      "dev": true
-    },
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -2480,10 +2933,20 @@
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
     },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+      "dev": true,
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
     "d3": {
-      "version": "5.9.2",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-5.9.2.tgz",
-      "integrity": "sha512-ydrPot6Lm3nTWH+gJ/Cxf3FcwuvesYQ5uk+j/kXEH/xbuYWYWTMAHTJQkyeuG8Y5WM5RSEYB41EctUrXQQytRQ==",
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz",
+      "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==",
       "requires": {
         "d3-array": "1",
         "d3-axis": "1",
@@ -2529,9 +2992,9 @@
       "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
     },
     "d3-brush": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz",
-      "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz",
+      "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==",
       "requires": {
         "d3-dispatch": "1",
         "d3-drag": "1",
@@ -2555,9 +3018,9 @@
       "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
     },
     "d3-color": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz",
-      "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw=="
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz",
+      "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg=="
     },
     "d3-contour": {
       "version": "1.3.2",
@@ -2573,9 +3036,9 @@
       "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g=="
     },
     "d3-drag": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz",
-      "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
+      "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
       "requires": {
         "d3-dispatch": "1",
         "d3-selection": "1"
@@ -2592,9 +3055,9 @@
       }
     },
     "d3-ease": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz",
-      "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz",
+      "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ=="
     },
     "d3-fetch": {
       "version": "1.1.2",
@@ -2616,45 +3079,45 @@
       }
     },
     "d3-format": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz",
-      "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ=="
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz",
+      "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ=="
     },
     "d3-geo": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.3.tgz",
-      "integrity": "sha512-n30yN9qSKREvV2fxcrhmHUdXP9TNH7ZZj3C/qnaoU0cVf/Ea85+yT7HY7i8ySPwkwjCNYtmKqQFTvLFngfkItQ==",
+      "version": "1.11.9",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz",
+      "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==",
       "requires": {
         "d3-array": "1"
       }
     },
     "d3-hierarchy": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz",
-      "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w=="
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
+      "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
     },
     "d3-interpolate": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz",
-      "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
+      "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
       "requires": {
         "d3-color": "1"
       }
     },
     "d3-path": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz",
-      "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA=="
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
     },
     "d3-polygon": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz",
-      "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
+      "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
     },
     "d3-quadtree": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.6.tgz",
-      "integrity": "sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA=="
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
+      "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
     },
     "d3-queue": {
       "version": "3.0.7",
@@ -2691,9 +3154,9 @@
       }
     },
     "d3-scale-chromatic": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz",
-      "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
+      "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
       "requires": {
         "d3-color": "1",
         "d3-interpolate": "1"
@@ -2705,30 +3168,30 @@
       "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg=="
     },
     "d3-shape": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz",
-      "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==",
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
       "requires": {
         "d3-path": "1"
       }
     },
     "d3-time": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz",
-      "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
+      "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
     },
     "d3-time-format": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz",
-      "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==",
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz",
+      "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==",
       "requires": {
         "d3-time": "1"
       }
     },
     "d3-timer": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz",
-      "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg=="
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
+      "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
     },
     "d3-tip": {
       "version": "0.9.1",
@@ -2740,9 +3203,9 @@
       }
     },
     "d3-transition": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz",
-      "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
+      "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
       "requires": {
         "d3-color": "1",
         "d3-dispatch": "1",
@@ -2758,9 +3221,9 @@
       "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
     },
     "d3-zoom": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz",
-      "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==",
+      "version": "1.8.3",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
+      "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
       "requires": {
         "d3-dispatch": "1",
         "d3-drag": "1",
@@ -3045,6 +3508,29 @@
       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
       "dev": true
     },
+    "default-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^5.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "default-resolution": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+      "dev": true
+    },
     "define-properties": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -3095,6 +3581,39 @@
         }
       }
     },
+    "del": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
+      "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
+      "dev": true,
+      "requires": {
+        "globby": "^10.0.1",
+        "graceful-fs": "^4.2.2",
+        "is-glob": "^4.0.1",
+        "is-path-cwd": "^2.2.0",
+        "is-path-inside": "^3.0.1",
+        "p-map": "^3.0.0",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+          "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
+          "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
     "depd": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -3146,6 +3665,23 @@
         "randombytes": "^2.0.0"
       }
     },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
+        }
+      }
+    },
     "doctrine": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
@@ -3179,6 +3715,16 @@
         "stream-shift": "^1.0.0"
       }
     },
+    "each-props": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
+      "dev": true,
+      "requires": {
+        "is-plain-object": "^2.0.1",
+        "object.defaults": "^1.1.0"
+      }
+    },
     "easy-extender": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
@@ -3204,9 +3750,9 @@
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.3.143",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.143.tgz",
-      "integrity": "sha512-J9jOpxIljQZlV6GIP2fwAWq0T69syawU0sH3EW3O2Bgxquiy+veeIT5mBDRz+i3oHUSL1tvVgRKH3/4QiQh9Pg==",
+      "version": "1.3.334",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.334.tgz",
+      "integrity": "sha512-RcjJhpsVaX0X6ntu/WSBlW9HE9pnCgXS9B8mTUObl1aDxaiOa0Lu+NMveIS5IDC+VELzhM32rFJDCC+AApVwcA==",
       "dev": true
     },
     "elliptic": {
@@ -3396,6 +3942,50 @@
         "is-symbol": "^1.0.2"
       }
     },
+    "es5-ext": {
+      "version": "0.10.53",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+      "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.3",
+        "next-tick": "~1.0.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+      "dev": true,
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.46",
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.1"
+      }
+    },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -3698,6 +4288,29 @@
         "homedir-polyfill": "^1.0.1"
       }
     },
+    "ext": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+      "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+      "dev": true,
+      "requires": {
+        "type": "^2.0.0"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
+          "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
     "extend-shallow": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -3795,12 +4408,91 @@
         }
       }
     },
+    "fancy-log": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+      "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+      "dev": true,
+      "requires": {
+        "ansi-gray": "^0.1.1",
+        "color-support": "^1.1.3",
+        "parse-node-version": "^1.0.0",
+        "time-stamp": "^1.0.0"
+      }
+    },
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
       "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
       "dev": true
     },
+    "fast-glob": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz",
+      "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
@@ -3813,6 +4505,15 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
+    "fastq": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz",
+      "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.0"
+      }
+    },
     "faye-websocket": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
@@ -3944,6 +4645,25 @@
         "resolve-dir": "^1.0.1"
       }
     },
+    "fined": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "is-plain-object": "^2.0.3",
+        "object.defaults": "^1.1.0",
+        "object.pick": "^1.2.0",
+        "parse-filepath": "^1.0.1"
+      }
+    },
+    "flagged-respawn": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+      "dev": true
+    },
     "flat-cache": {
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
@@ -3998,6 +4718,15 @@
       "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
       "dev": true
     },
+    "for-own": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -4040,6 +4769,16 @@
         "universalify": "^0.1.0"
       }
     },
+    "fs-mkdirp-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "through2": "^2.0.3"
+      }
+    },
     "fs-write-stream-atomic": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
@@ -4618,6 +5357,12 @@
       "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
       "dev": true
     },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+      "dev": true
+    },
     "get-caller-file": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
@@ -4674,6 +5419,38 @@
         }
       }
     },
+    "glob-stream": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
+      "dev": true,
+      "requires": {
+        "extend": "^3.0.0",
+        "glob": "^7.1.1",
+        "glob-parent": "^3.1.0",
+        "is-negated-glob": "^1.0.0",
+        "ordered-read-streams": "^1.0.0",
+        "pumpify": "^1.3.5",
+        "readable-stream": "^2.1.5",
+        "remove-trailing-separator": "^1.0.1",
+        "to-absolute-glob": "^2.0.0",
+        "unique-stream": "^2.0.2"
+      }
+    },
+    "glob-watcher": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz",
+      "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-done": "^1.2.0",
+        "chokidar": "^2.0.0",
+        "is-negated-glob": "^1.0.0",
+        "just-debounce": "^1.0.0",
+        "object.defaults": "^1.1.0"
+      }
+    },
     "global-modules": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
@@ -4715,56 +5492,238 @@
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true
     },
+    "globby": {
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+      "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.0.3",
+        "glob": "^7.1.3",
+        "ignore": "^5.1.1",
+        "merge2": "^1.2.3",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.1.4",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
+          "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+          "dev": true
+        }
+      }
+    },
+    "glogg": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
+      "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
+      "dev": true,
+      "requires": {
+        "sparkles": "^1.0.0"
+      }
+    },
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
       "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
       "dev": true
     },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+    "gulp": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
+      "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
       "dev": true,
       "requires": {
-        "function-bind": "^1.1.1"
+        "glob-watcher": "^5.0.3",
+        "gulp-cli": "^2.2.0",
+        "undertaker": "^1.2.1",
+        "vinyl-fs": "^3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "gulp-cli": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
+          "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
+          "dev": true,
+          "requires": {
+            "ansi-colors": "^1.0.1",
+            "archy": "^1.0.0",
+            "array-sort": "^1.0.0",
+            "color-support": "^1.1.3",
+            "concat-stream": "^1.6.0",
+            "copy-props": "^2.0.1",
+            "fancy-log": "^1.3.2",
+            "gulplog": "^1.0.0",
+            "interpret": "^1.1.0",
+            "isobject": "^3.0.1",
+            "liftoff": "^3.1.0",
+            "matchdep": "^2.0.0",
+            "mute-stdout": "^1.0.0",
+            "pretty-hrtime": "^1.0.0",
+            "replace-homedir": "^1.0.0",
+            "semver-greatest-satisfied-range": "^1.1.0",
+            "v8flags": "^3.0.1",
+            "yargs": "^7.1.0"
+          }
+        },
+        "yargs": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+          "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^1.4.0",
+            "read-pkg-up": "^1.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^1.0.2",
+            "which-module": "^1.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^5.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+          "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0"
+          }
+        }
       }
     },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+    "gulp-concat": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
+      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
       "dev": true,
       "requires": {
-        "ansi-regex": "^2.0.0"
+        "concat-with-sourcemaps": "^1.0.0",
+        "through2": "^2.0.0",
+        "vinyl": "^2.0.0"
       }
     },
-    "has-binary2": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
-      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+    "gulp-header": {
+      "version": "2.0.9",
+      "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-2.0.9.tgz",
+      "integrity": "sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==",
       "dev": true,
       "requires": {
-        "isarray": "2.0.1"
+        "concat-with-sourcemaps": "^1.1.0",
+        "lodash.template": "^4.5.0",
+        "map-stream": "0.0.7",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "map-stream": {
+          "version": "0.0.7",
+          "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+          "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
+          "dev": true
+        }
       }
     },
-    "has-cors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
-      "dev": true
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
-      "dev": true
+    "gulp-minify": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz",
+      "integrity": "sha512-ixF41aYg+NQikI8hpoHdEclYcQkbGdXQu1CBdHaU7Epg8H6e8d2jWXw1+rBPgYwl/XpKgjHj7NI6gkhoSNSSAg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^1.0.1",
+        "minimatch": "^3.0.2",
+        "plugin-error": "^0.1.2",
+        "terser": "^3.7.6",
+        "through2": "^2.0.3",
+        "vinyl": "^2.1.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "terser": {
+          "version": "3.17.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
+          "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
+          "dev": true,
+          "requires": {
+            "commander": "^2.19.0",
+            "source-map": "~0.6.1",
+            "source-map-support": "~0.5.10"
+          }
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "^1.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "has-binary2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+      "dev": true,
+      "requires": {
+        "isarray": "2.0.1"
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true
     },
     "has-value": {
       "version": "1.0.0",
@@ -4962,6 +5921,12 @@
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
       "dev": true
     },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
+    },
     "indexes-of": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
@@ -5078,6 +6043,16 @@
       "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
       "dev": true
     },
+    "is-absolute": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+      "dev": true,
+      "requires": {
+        "is-relative": "^1.0.0",
+        "is-windows": "^1.0.1"
+      }
+    },
     "is-accessor-descriptor": {
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
@@ -5200,6 +6175,12 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-negated-glob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+      "dev": true
+    },
     "is-number": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -5229,6 +6210,18 @@
         "lodash.isfinite": "^3.3.2"
       }
     },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "dev": true
+    },
+    "is-path-inside": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+      "dev": true
+    },
     "is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -5253,6 +6246,15 @@
         "has": "^1.0.1"
       }
     },
+    "is-relative": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+      "dev": true,
+      "requires": {
+        "is-unc-path": "^1.0.0"
+      }
+    },
     "is-resolvable": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
@@ -5274,12 +6276,27 @@
         "has-symbols": "^1.0.0"
       }
     },
+    "is-unc-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+      "dev": true,
+      "requires": {
+        "unc-path-regex": "^0.1.2"
+      }
+    },
     "is-utf8": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
       "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
       "dev": true
     },
+    "is-valid-glob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+      "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+      "dev": true
+    },
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -5310,12 +6327,6 @@
       "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
       "dev": true
     },
-    "js-levenshtein": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
-      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
-      "dev": true
-    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -5357,9 +6368,9 @@
       "dev": true
     },
     "json5": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
-      "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
+      "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.0"
@@ -5380,12 +6391,37 @@
       "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
       "dev": true
     },
+    "just-debounce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+      "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+      "dev": true
+    },
     "kind-of": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
       "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
       "dev": true
     },
+    "last-run": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+      "dev": true,
+      "requires": {
+        "default-resolution": "^2.0.0",
+        "es6-weak-map": "^2.0.1"
+      }
+    },
+    "lazystream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.5"
+      }
+    },
     "lcid": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
@@ -5395,6 +6431,30 @@
         "invert-kv": "^1.0.0"
       }
     },
+    "lead": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+      "dev": true,
+      "requires": {
+        "flush-write-stream": "^1.0.2"
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levenary": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz",
+      "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==",
+      "dev": true,
+      "requires": {
+        "leven": "^3.1.0"
+      }
+    },
     "levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -5405,6 +6465,22 @@
         "type-check": "~0.3.2"
       }
     },
+    "liftoff": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
+      "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
+      "dev": true,
+      "requires": {
+        "extend": "^3.0.0",
+        "findup-sync": "^3.0.0",
+        "fined": "^1.0.1",
+        "flagged-respawn": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "object.map": "^1.0.0",
+        "rechoir": "^0.6.2",
+        "resolve": "^1.1.7"
+      }
+    },
     "limiter": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz",
@@ -5412,17 +6488,17 @@
       "dev": true
     },
     "lit-element": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.1.0.tgz",
-      "integrity": "sha512-0z/KHm1xZweivfOVRr8AKR06+D3k02u15m9s4jkuRdnGe5wfmEwePzrQQBsSZNILdnfJvfo3TJOeGhBCVZaPbw==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.2.1.tgz",
+      "integrity": "sha512-ipDcgQ1EpW6Va2Z6dWm79jYdimVepO5GL0eYkZrFvdr0OD/1N260Q9DH+K5HXHFrRoC7dOg+ZpED2XE0TgGdXw==",
       "requires": {
         "lit-html": "^1.0.0"
       }
     },
     "lit-html": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.1.0.tgz",
-      "integrity": "sha512-ZDJHpJi09yknMpjwPI8fuSl5sUG7+pF+eE5WciFtgyX7zebvgMDBgSLq4knXa7grxM00RkQ7PBd7UZQiruA78Q=="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.1.2.tgz",
+      "integrity": "sha512-FFlUMKHKi+qG1x1iHNZ1hrtc/zHmfYTyrSvs3/wBTvaNtpZjOZGWzU7efGYVpgp6KvWeKF6ql9/KsCq6Z/mEDA=="
     },
     "live-server": {
       "version": "1.2.1",
@@ -5618,12 +6694,37 @@
       "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
       "dev": true
     },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
     "lodash.isfinite": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
       "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=",
       "dev": true
     },
+    "lodash.template": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.templatesettings": "^4.0.0"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0"
+      }
+    },
     "loose-envify": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -5659,6 +6760,15 @@
       "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
       "dev": true
     },
+    "make-iterator": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
     "mamacro": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
@@ -5695,6 +6805,41 @@
         "object-visit": "^1.0.0"
       }
     },
+    "matchdep": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+      "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+      "dev": true,
+      "requires": {
+        "findup-sync": "^2.0.0",
+        "micromatch": "^3.0.4",
+        "resolve": "^1.4.0",
+        "stack-trace": "0.0.10"
+      },
+      "dependencies": {
+        "findup-sync": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+          "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+          "dev": true,
+          "requires": {
+            "detect-file": "^1.0.0",
+            "is-glob": "^3.1.0",
+            "micromatch": "^3.0.4",
+            "resolve-dir": "^1.0.1"
+          }
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
     "md5.js": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -5741,6 +6886,12 @@
       "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
       "dev": true
     },
+    "merge2": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
+      "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+      "dev": true
+    },
     "micromatch": {
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -5938,6 +7089,12 @@
       "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
       "dev": true
     },
+    "mute-stdout": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
+      "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
+      "dev": true
+    },
     "mute-stream": {
       "version": "0.0.7",
       "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
@@ -5988,6 +7145,12 @@
       "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
       "dev": true
     },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
     "nice-try": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -6034,12 +7197,20 @@
       }
     },
     "node-releases": {
-      "version": "1.1.22",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.22.tgz",
-      "integrity": "sha512-O6XpteBuntW1j86mw6LlovBIwTe+sO2+7vi9avQffNeIW4upgnaCVm6xrBWH+KATz7mNNRNNeEpuWB7dT6Cr3w==",
+      "version": "1.1.45",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz",
+      "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==",
       "dev": true,
       "requires": {
-        "semver": "^5.3.0"
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
       }
     },
     "normalize-package-data": {
@@ -6060,6 +7231,15 @@
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true
     },
+    "now-and-later": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
+      "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.2"
+      }
+    },
     "npm-run-all": {
       "version": "4.1.5",
       "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
@@ -6190,74 +7370,275 @@
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-path": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
+      "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
+      }
+    },
+    "object.defaults": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+      "dev": true,
+      "requires": {
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.reduce": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onchange": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/onchange/-/onchange-6.1.0.tgz",
+      "integrity": "sha512-T0wvi3yzNd+Lut2ymJp2e6fTiob0TLrXnjqGaiK9MAFB8MYo/k/ZClx6ps7YhTtQ88dDm+hDHmtJXP1nJT5WNA==",
+      "dev": true,
+      "requires": {
+        "@blakeembrey/deque": "^1.0.3",
+        "arrify": "^2.0.0",
+        "chokidar": "^3.0.0",
+        "cross-spawn": "^6.0.0",
+        "ignore": "^5.1.4",
+        "minimist": "^1.2.0",
+        "supports-color": "^7.0.0",
+        "tree-kill": "^1.2.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "arrify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+          "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+          "dev": true
+        },
+        "binary-extensions": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
+          "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.3.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+          "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "ignore": {
+          "version": "5.1.4",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
+          "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+          "dev": true
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
+          "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
+          "dev": true,
+          "requires": {
+            "picomatch": "^2.0.7"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
           }
         },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "is-number": "^7.0.0"
           }
         }
       }
     },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
-    },
-    "object-path": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
-      "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "dev": true,
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
     "onetime": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
@@ -6296,6 +7677,15 @@
         "wordwrap": "~1.0.0"
       }
     },
+    "ordered-read-streams": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
     "os-browserify": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@@ -6353,6 +7743,15 @@
         "p-limit": "^2.0.0"
       }
     },
+    "p-map": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+      "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+      "dev": true,
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
     "p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -6390,6 +7789,17 @@
         "safe-buffer": "^5.1.1"
       }
     },
+    "parse-filepath": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+      "dev": true,
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
+      }
+    },
     "parse-json": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -6399,6 +7809,12 @@
         "error-ex": "^1.2.0"
       }
     },
+    "parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true
+    },
     "parse-passwd": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
@@ -6477,6 +7893,21 @@
       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
       "dev": true
     },
+    "path-root": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+      "dev": true,
+      "requires": {
+        "path-root-regex": "^0.1.0"
+      }
+    },
+    "path-root-regex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+      "dev": true
+    },
     "path-type": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
@@ -6518,6 +7949,12 @@
         "sha.js": "^2.4.8"
       }
     },
+    "picomatch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
+      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
+      "dev": true
+    },
     "pidtree": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
@@ -6554,6 +7991,58 @@
         "find-up": "^3.0.0"
       }
     },
+    "plugin-error": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+      "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+      "dev": true,
+      "requires": {
+        "ansi-cyan": "^0.1.1",
+        "ansi-red": "^0.1.1",
+        "arr-diff": "^1.0.1",
+        "arr-union": "^2.0.1",
+        "extend-shallow": "^1.1.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+          "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.0.1",
+            "array-slice": "^0.2.3"
+          }
+        },
+        "arr-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+          "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+          "dev": true
+        },
+        "array-slice": {
+          "version": "0.2.3",
+          "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+          "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+          "dev": true
+        },
+        "extend-shallow": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+          "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^1.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+          "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+          "dev": true
+        }
+      }
+    },
     "pluralize": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
@@ -6667,6 +8156,12 @@
       "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
       "dev": true
     },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+      "dev": true
+    },
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -6899,6 +8394,15 @@
         "readable-stream": "^2.0.2"
       }
     },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
     "regenerate": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
@@ -6915,15 +8419,15 @@
       }
     },
     "regenerator-runtime": {
-      "version": "0.13.2",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
-      "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==",
+      "version": "0.13.3",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+      "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
       "dev": true
     },
     "regenerator-transform": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz",
-      "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==",
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
+      "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
       "dev": true,
       "requires": {
         "private": "^0.1.6"
@@ -6939,12 +8443,6 @@
         "safe-regex": "^1.1.0"
       }
     },
-    "regexp-tree": {
-      "version": "0.1.10",
-      "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz",
-      "integrity": "sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==",
-      "dev": true
-    },
     "regexpp": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
@@ -6952,13 +8450,13 @@
       "dev": true
     },
     "regexpu-core": {
-      "version": "4.5.4",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz",
-      "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
+      "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
       "dev": true,
       "requires": {
         "regenerate": "^1.4.0",
-        "regenerate-unicode-properties": "^8.0.2",
+        "regenerate-unicode-properties": "^8.1.0",
         "regjsgen": "^0.5.0",
         "regjsparser": "^0.6.0",
         "unicode-match-property-ecmascript": "^1.0.4",
@@ -6966,15 +8464,15 @@
       }
     },
     "regjsgen": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
-      "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
       "dev": true
     },
     "regjsparser": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-      "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz",
+      "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==",
       "dev": true,
       "requires": {
         "jsesc": "~0.5.0"
@@ -6988,6 +8486,27 @@
         }
       }
     },
+    "remove-bom-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+      "dev": true,
+      "requires": {
+        "is-buffer": "^1.1.5",
+        "is-utf8": "^0.2.1"
+      }
+    },
+    "remove-bom-stream": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+      "dev": true,
+      "requires": {
+        "remove-bom-buffer": "^3.0.0",
+        "safe-buffer": "^5.1.0",
+        "through2": "^2.0.3"
+      }
+    },
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -7006,6 +8525,23 @@
       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
       "dev": true
     },
+    "replace-ext": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+      "dev": true
+    },
+    "replace-homedir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+      "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1",
+        "is-absolute": "^1.0.0",
+        "remove-trailing-separator": "^1.1.0"
+      }
+    },
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -7089,6 +8625,15 @@
       "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
       "dev": true
     },
+    "resolve-options": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+      "dev": true,
+      "requires": {
+        "value-or-function": "^3.0.0"
+      }
+    },
     "resolve-url": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
@@ -7138,6 +8683,12 @@
       "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
       "dev": true
     },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
     "rimraf": {
       "version": "2.6.3",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
@@ -7166,6 +8717,12 @@
         "is-promise": "^2.1.0"
       }
     },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+      "dev": true
+    },
     "run-queue": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
@@ -7247,6 +8804,15 @@
       "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
       "dev": true
     },
+    "semver-greatest-satisfied-range": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+      "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+      "dev": true,
+      "requires": {
+        "sver-compat": "^1.5.0"
+      }
+    },
     "send": {
       "version": "0.16.2",
       "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
@@ -7473,6 +9039,12 @@
       "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
       "dev": true
     },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
     "slice-ansi": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
@@ -7828,6 +9400,12 @@
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
       "dev": true
     },
+    "sparkles": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+      "dev": true
+    },
     "spdx-correct": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
@@ -7893,6 +9471,12 @@
         "figgy-pudding": "^3.5.1"
       }
     },
+    "stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+      "dev": true
+    },
     "static-extend": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -7949,6 +9533,12 @@
         "stream-shift": "^1.0.0"
       }
     },
+    "stream-exhaust": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+      "dev": true
+    },
     "stream-http": {
       "version": "2.8.3",
       "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
@@ -8058,6 +9648,16 @@
         "has-flag": "^3.0.0"
       }
     },
+    "sver-compat": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+      "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "^2.0.1",
+        "es6-symbol": "^3.1.1"
+      }
+    },
     "symbol-observable": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
@@ -8250,6 +9850,22 @@
         "xtend": "~4.0.1"
       }
     },
+    "through2-filter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
+      "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
+      "dev": true,
+      "requires": {
+        "through2": "~2.0.0",
+        "xtend": "~4.0.0"
+      }
+    },
+    "time-stamp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+      "dev": true
+    },
     "timers-browserify": {
       "version": "2.0.11",
       "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
@@ -8268,6 +9884,16 @@
         "os-tmpdir": "~1.0.2"
       }
     },
+    "to-absolute-glob": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+      "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+      "dev": true,
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "is-negated-glob": "^1.0.0"
+      }
+    },
     "to-array": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
@@ -8328,16 +9954,25 @@
         "repeat-string": "^1.6.1"
       }
     },
+    "to-through": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+      "dev": true,
+      "requires": {
+        "through2": "^2.0.3"
+      }
+    },
     "toidentifier": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
       "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
       "dev": true
     },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+    "tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
       "dev": true
     },
     "ts-node": {
@@ -8368,6 +10003,12 @@
       "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
       "dev": true
     },
+    "type": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
+      "dev": true
+    },
     "type-check": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -8384,9 +10025,9 @@
       "dev": true
     },
     "typescript": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
-      "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
+      "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw=="
     },
     "ua-parser-js": {
       "version": "0.7.17",
@@ -8400,6 +10041,35 @@
       "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
       "dev": true
     },
+    "unc-path-regex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+      "dev": true
+    },
+    "undertaker": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
+      "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.0.1",
+        "arr-map": "^2.0.0",
+        "bach": "^1.0.0",
+        "collection-map": "^1.0.0",
+        "es6-weak-map": "^2.0.1",
+        "last-run": "^1.1.0",
+        "object.defaults": "^1.0.0",
+        "object.reduce": "^1.0.0",
+        "undertaker-registry": "^1.0.0"
+      }
+    },
+    "undertaker-registry": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+      "dev": true
+    },
     "unicode-canonical-property-names-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -8464,6 +10134,16 @@
         "imurmurhash": "^0.1.4"
       }
     },
+    "unique-stream": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
+      "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
+      "dev": true,
+      "requires": {
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "through2-filter": "^3.0.0"
+      }
+    },
     "universalify": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -8625,6 +10305,15 @@
       "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
       "dev": true
     },
+    "v8flags": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
+      "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
     "validate-npm-package-license": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -8635,12 +10324,83 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
+    "value-or-function": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+      "dev": true
+    },
     "vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
       "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true
     },
+    "vinyl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+      "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.1",
+        "clone-buffer": "^1.0.0",
+        "clone-stats": "^1.0.0",
+        "cloneable-readable": "^1.0.0",
+        "remove-trailing-separator": "^1.0.1",
+        "replace-ext": "^1.0.0"
+      }
+    },
+    "vinyl-fs": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
+      "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
+      "dev": true,
+      "requires": {
+        "fs-mkdirp-stream": "^1.0.0",
+        "glob-stream": "^6.1.0",
+        "graceful-fs": "^4.0.0",
+        "is-valid-glob": "^1.0.0",
+        "lazystream": "^1.0.0",
+        "lead": "^1.0.0",
+        "object.assign": "^4.0.4",
+        "pumpify": "^1.3.5",
+        "readable-stream": "^2.3.3",
+        "remove-bom-buffer": "^3.0.0",
+        "remove-bom-stream": "^1.2.0",
+        "resolve-options": "^1.1.0",
+        "through2": "^2.0.0",
+        "to-through": "^2.0.0",
+        "value-or-function": "^3.0.0",
+        "vinyl": "^2.0.0",
+        "vinyl-sourcemap": "^1.1.0"
+      }
+    },
+    "vinyl-sourcemap": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+      "dev": true,
+      "requires": {
+        "append-buffer": "^1.0.2",
+        "convert-source-map": "^1.5.0",
+        "graceful-fs": "^4.1.6",
+        "normalize-path": "^2.1.1",
+        "now-and-later": "^2.0.0",
+        "remove-bom-buffer": "^3.0.0",
+        "vinyl": "^2.0.0"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
     "vm-browserify": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
diff --git a/package.json b/package.json
index eedd3718e484fd6c29fc63349285f40c2c78b6ac..fb953c66bfe3608eda769636b4d0178b825f573c 100644
--- a/package.json
+++ b/package.json
@@ -1,32 +1,38 @@
 {
-  "name": "interactions",
-  "version": "1.0.0",
+  "name": "pdb-ligand-env",
+  "version": "0.2.0",
   "description": "",
   "main": "app.js",
   "dependencies": {
     "@types/d3": "^5.0.1",
     "@types/d3-tip": "^3.5.5",
-    "d3": "^5.7.0",
+    "d3": "^5.15.0",
     "d3-tip": "^0.9.1",
     "d3scription": "^1.0.1",
-    "lit-element": "^2.1.0",
-    "typescript": "^3.1.6"
+    "lit-element": "^2.2.1",
+    "typescript": "^3.7.4"
   },
   "devDependencies": {
-    "@babel/core": "^7.3.3",
-    "@babel/plugin-transform-runtime": "^7.2.0",
-    "@babel/preset-env": "^7.3.1",
-    "@babel/runtime": "^7.3.1",
-    "@webcomponents/webcomponentsjs": "^2.1.3",
+    "@babel/core": "^7.8.3",
+    "@babel/plugin-transform-runtime": "^7.8.3",
+    "@babel/preset-env": "^7.8.3",
+    "@babel/runtime": "^7.8.3",
+    "@webcomponents/webcomponentsjs": "^2.4.1",
     "babel-loader": "^8.0.5",
     "browser-sync": "^2.26.7",
     "camelcase": "^5.0.0",
     "clean-webpack-plugin": "^1.0.1",
     "css-loader": "^2.1.0",
+    "del": "^5.1.0",
     "eslint": "^4.12.0",
     "file-loader": "^3.0.1",
+    "gulp": "^4.0.2",
+    "gulp-concat": "^2.6.1",
+    "gulp-header": "^2.0.9",
+    "gulp-minify": "^3.1.0",
     "live-server": "^1.2.1",
     "npm-run-all": "^4.1.3",
+    "onchange": "^6.1.0",
     "style-loader": "^0.23.1",
     "ts-node": "^7.0.1",
     "url-loader": "^1.1.2",
@@ -34,12 +40,12 @@
     "webpack-cli": "^3.3.10"
   },
   "scripts": {
-    "tsc:w": "tsc -w",
-    "prestart": "tsc",
-    "serve": "live-server build --watch=src/**/*.html,src/bundle.js,src/**/*.css",
-    "start": "npm-run-all --parallel serve tsc:w",
-    "webpack": "webpack",
-    "buildComponent": "webpack --mode=development"
+    "tscW": "tsc -w",
+    "serve": "live-server build --watch=build",
+    "start": "npm-run-all --parallel watch serve",
+    "build": "tsc && webpack --mode=development && gulp",
+    "watch": "onchange 'src/**/*' -- npm run build",
+    "buildProduction": "tsc && webpack --mode=production && gulp"
   },
   "author": "Lukas Pravda",
   "license": "Apache License 2.0"
diff --git a/src/component.js b/src/component.js
deleted file mode 100644
index fa5b743dbd4d3e08b0805e834260f50ea8ac0bb9..0000000000000000000000000000000000000000
--- a/src/component.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// Import the LitElement base class and html helper function
-import { LitElement, html } from 'lit-element';
-
-// Extend the LitElement base class
-class pdbInteractions extends LitElement {
-
-  //Get properties / attribute values
-  static get properties() {
-    return {
-      'pdb-id': { type: String },
-      'bound-molecule-id': { type: String },
-      'pdb-res-id': { type: Number },
-      'pdb-chain-id': { type: String }
-    };
-  }
-
-  constructor() {
-    super();
-  }
-
-  render() {
-    return html`
-      
-      ${!this['pdb-id'] ?
-        html`<div style='text-align:center;font-weight:bold;margin-top:20px;'>Error: Specify valid 'pdb-id' attribute to render the component.<div>` :
-        html``
-      }
-    `;
-  }
-
-  updated(changedProperties) {
-    if (this['pdb-id']) {
-      this.display = new Visualization(this);
-
-      if (this['bound-molecule-id']) {
-        this.display.initialiseBoundMolecule(this['pdb-id'], this['bound-molecule-id']);
-      }
-      else {
-        this.display.initialiseLigand(this['pdb-id'], this['pdb-res-id'], this['pdb-chain-id'])
-      }
-    }
-  }
-
-  connectedCallback() {
-    super.connectedCallback();
-
-    this.style.display = 'block';
-    this.style.height = '100%';
-    this.style.width = '100%';
-    this.style.position = 'relative';
-
-  }
-
-  createRenderRoot() {
-    /**
-     * Render template in light DOM. Note that shadow DOM features like 
-     * encapsulated CSS are unavailable.
-     */
-    return this;
-  }
-
-}
-// Register the new element with the browser.
-customElements.define('pdb-interactions', pdbInteractions);
\ No newline at end of file
diff --git a/src/component/component.js b/src/component/component.js
new file mode 100644
index 0000000000000000000000000000000000000000..5787f89e1262bb3e19290753b4feaa158dc241f2
--- /dev/null
+++ b/src/component/component.js
@@ -0,0 +1,93 @@
+// Import the LitElement base class and html helper function
+import { LitElement, html } from 'lit-element';
+import "../styles/pdb-ligand-env.css";
+
+// Extend the LitElement base class
+class pdbLigandEnv extends LitElement {
+
+  //Get properties / attribute values
+  static get properties() {
+    return {
+      pdbId: { type: String, attribute: 'pdb-id' },
+      bmId: { type: String, attribute: 'bound-molecule-id' },
+      resName: { type: String, attribute: 'pdb-res-name' },
+      resId: { type: Number, attribute: 'pdb-res-id' },
+      chainId: { type: String, attribute: 'pdb-chain-id' },
+      substructureHighlight: { type: Array, attribute: 'substructure' },
+      substructureColor: { type: String, attribute: 'color' },
+      zoomOn: { type: Boolean, attribute: 'zoom-on' },
+    };
+  }
+
+  constructor() {
+    super();
+  }
+
+  async connectedCallback() {
+    let uiParams = new Config.UIParameters();
+    uiParams.zoom = this.zoomOn;
+
+    this.display = new Visualization(this, uiParams);
+
+    if (this.pdbId) {
+      if (this.bmId) {
+        this.display.initBoundMoleculeInteractions(this.pdbId, this.bmId);
+      }
+      else {
+        this.display.initLigandInteractions(this.pdbId, this.resId, this.chainId);
+      }
+    }
+    else if (this.resName) {
+      this.display.initLigandDisplay(this.resName).then(() => this.display.centerScene());
+    }
+  }
+
+
+  //#region properties
+  set depiction(data) {
+    if (!data) return;
+
+    this.display.addDepiction(data, false);
+    this.display.centerScene();
+  }
+
+  set ligandHighlight(data) {
+    if (!data || !this.display) {
+      console.log(`Argument needs to be a non empty array of strings.`);
+      return;
+    }
+
+    this.display.addLigandHighlight(data, this.highlightColor);
+    this.substructureHighlight = data;
+  }
+
+  set highlightColor(data) {
+    if (!data || !this.display) return;
+
+    this.highlightColor = data;
+    this.display.addLigandHighlight(this.substructureHighlight, this.highlightColor);
+  }
+
+  set contourData(data) { 
+    if (!data || !this.display || !this.display.depiction !== undefined ) return;
+
+    this.display.addContours(data);
+  }
+
+  set zoom(data) {
+    if (this.display !== undefined) this.display.toogleZoom(data);
+  }
+  //#endregion properties
+
+
+  createRenderRoot() {
+    /**
+     * Render template in light DOM. Note that shadow DOM features like 
+     * encapsulated CSS are unavailable.
+     */
+    return this;
+  }
+
+}
+// Register the new element with the browser.
+customElements.define('pdb-ligand-env', pdbLigandEnv);
\ No newline at end of file
diff --git a/src/manager.ts b/src/manager.ts
deleted file mode 100644
index 1e4637cfb9e325811fca9fed68ba22d06ca1c937..0000000000000000000000000000000000000000
--- a/src/manager.ts
+++ /dev/null
@@ -1,644 +0,0 @@
-/// <reference path="./visualsMapping.ts" />
-/// <reference path="./depiction.ts" />
-
-const server: string = "https://wwwdev.ebi.ac.uk/pdbe/graph-api";
-
-const clickEvent = 'PDB.interactions.click';
-const mouseoverEvent = 'PDB.interactions.mouseover';
-const mouseoutEvent = 'PDB.interactions.mouseout'
-
-class Visualization {
-    // component related
-    private parent: HTMLElement;
-
-    // #region svg properties
-    private canvas: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-    private simulation: d3.Simulation<d3.SimulationNodeDatum, undefined>;
-    private svg: d3.Selection<any, {}, HTMLElement, any>;
-    private visualization: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-
-    private nodes: any;
-    private links: any
-    // #endregion
-
-    // #region ui properties
-    private residueLabel: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-    private tooltip: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-    // #endregion
-
-    // #region data properties    
-    private pdbId: string;
-    private bindingSite: Model.BindingSite;
-    private depiction: Depiction;
-
-    private visualsMapper: VisualsMapper;
-    private interactionsData: any;
-    private selectedResidueHash: string;
-    // #endregion
-
-    constructor(element: HTMLElement) {
-        this.parent = element;
-        this.visualsMapper = new VisualsMapper();
-
-        new UI(this.parent, this).register(new Model.UIParameters());
-
-        this.tooltip = d3.select("#int-tooltip");
-        this.residueLabel = d3.select('#int-residue-label');
-
-        this.canvas = d3.select(this.parent)
-            .append('div')
-            .attr('id', 'int-canvas');
-
-        this.svg = this.canvas
-            .append('svg')
-            .attr('xmlns', 'http://www.w3.org/2000/svg')
-            .attr('width', () => this.parent.offsetWidth)
-            .attr('height', () => this.parent.offsetHeight)
-
-        document.addEventListener('PDB.molstar.click', e => this.nodeMouseEnterEventHandler(e));
-        document.addEventListener('PDB.molstar.mouseover', e => this.nodeMouseEnterEventHandler(e));
-        document.addEventListener('PDB.molstar.mouseout', () => this.nodeMouseLeaveEventHandler());
-
-        d3.select(window).on('resize', () => this.resize(this));
-    }
-
-    // #region even handlers
-    private nodeMouseEnterEventHandler(e: any) {
-        let hash = `${e.eventData.auth_asym_id}${e.eventData.auth_seq_id}${e.eventData.ins_code}`;
-
-        if (this.nodes !== undefined) {
-            this.nodes.each((node: Model.InteractionNode, index: number, group: any) => {
-                if (node.id === hash) {
-                    this.selectedResidueHash = hash;
-                    this.nodeHighlight(node, index, group);
-                    return;
-                }
-            });
-        }
-    }
-
-    private nodeMouseLeaveEventHandler() {
-        if (this.nodes !== undefined) {
-            this.nodes.each((node: Model.InteractionNode, index: number, group: any) => {
-                if (node.id == this.selectedResidueHash) {
-                    this.nodeDim(node, index, group);
-                    return;
-                }
-            });
-        }
-    }
-
-    private linkMouseClickEventHandler(x: Model.Link) {
-        this.fireLinkEvent(x, clickEvent);
-    }
-
-    private linkMouseOverEventHandler(x: Model.Link) {
-        this.tooltip.transition()
-            .duration(200)
-            .style('opacity', .9);
-
-        this.tooltip.html(x.toTooltip());
-        this.fireLinkEvent(x, mouseoverEvent);
-    }
-
-    private linkMouseOutEventHandler() {
-        this.tooltip.transition()
-            .duration(200)
-            .style('opacity', 0);
-
-        this.fireLinkLeaveEvent();
-    }
-
-    private zoom_handler = d3.zoom()
-        .scaleExtent([1 / 10, 10])
-        .on('zoom', () => d3.select('#vis-root').attr('transform', d3.event.transform));
-
-    private drag_handler = d3.drag()
-        .on('start', (x: Model.InteractionNode) => {
-            if (!d3.event.active) this.simulation.alphaTarget(0.3).restart();
-
-            x.fx = x.x;
-            x.fy = x.y;
-        })
-        .on('drag', (x: Model.InteractionNode) => {
-            x.fx = d3.event.x;
-            x.fy = d3.event.y;
-        })
-        .on('end', (x: Model.InteractionNode) => {
-            if (!d3.event.active) this.simulation.alphaTarget(0);
-            x.fx = d3.event.x;
-            x.fy = d3.event.y;
-        });
-
-    // #endregion event handlers
-
-    public async initialiseBoundMolecule(pdbid: string, bmId: string) {
-        this.pdbId = pdbid;
-        this.addMarkers();
-
-        d3.json(`${server}/pdb/bound_molecule_interactions/${this.pdbId}/${bmId}`)
-            .catch(e => { throw e; })
-            .then((data: any) => {
-                let key = Object.keys(data)[0];
-                this.interactionsData = data;
-
-                this.bindingSite = new Model.BindingSite().fromBoundMolecule(key, data[key][0]);
-                this.bindingSite.bmId = bmId;
-                let ligands = this.bindingSite.residues.filter(x => x.isLigand);
-
-                if (ligands.length === 1) this.initialiseLigand(this.pdbId, ligands[0].authorResidueNumber, ligands[0].chainId);
-                else this.setupScene();
-            });
-    }
-
-    public async initialiseLigand(pdbId: string, resId: number, chainId: string) {
-        this.pdbId = pdbId;
-
-        d3.json(`${server}/pdb/bound_ligand_interactions/${pdbId}/${chainId}/${resId}`)
-            .catch(e => { throw e; })
-            .then((data: any) => {
-                let key = Object.keys(data)[0];
-                let body = data[key][0];
-                this.interactionsData = data;
-
-                d3.json(`https://www.ebi.ac.uk/pdbe/static/files/pdbechem_v2/${body.ligand.chem_comp_id}/annotation`)
-                    .catch(e => { throw e; })
-                    .then((d: any) => {
-                        this.depiction = new Depiction(d);
-                        this.bindingSite = new Model.BindingSite().fromLigand(key, body, this.depiction);
-                        this.setupLigandScene();
-                    });
-            });
-    }
-
-    // #region menu functions
-    public saveSvg(ctx: Visualization) {
-        d3.text('pdbe-interactions-svgstyles.css').then(x => {
-            let svgToDl = d3.select('#int-canvas');
-            svgToDl.select('svg')
-                .append('style')
-                .text(`/* <![CDATA[ */ \n ${x} \n /* ]]> */`);
-
-            let svgData = svgToDl.html();
-            let svgBlob = new Blob([svgData], { type: 'image/svg;charset=utf-8' });
-            let svgUrl = URL.createObjectURL(svgBlob);
-            let downloadLink = document.createElement('a');
-
-            downloadLink.href = svgUrl;
-            downloadLink.download = `${ctx.pdbId}_${ctx.bindingSite.bmId}.svg`;
-
-            document.body.appendChild(downloadLink);
-            downloadLink.click();
-            document.body.removeChild(downloadLink);
-        });
-    }
-
-
-    public downloadInteractionsData(ctx: Visualization): void {
-        let downloadLink = document.createElement('a');
-
-        let dataBlob = new Blob([JSON.stringify(ctx.interactionsData, null, 4)], { type: 'application/json' });
-
-        downloadLink.href = URL.createObjectURL(dataBlob);
-        downloadLink.download = `${ctx.pdbId}_${ctx.bindingSite.bmId}_interactions.json`;
-        document.body.appendChild(downloadLink);
-        downloadLink.click();
-        document.body.removeChild(downloadLink);
-    }
-
-
-    public reinitialize(ctx: Visualization) {
-        ctx.visualization.remove();
-
-        if (ctx.depiction === undefined) ctx.setupScene();
-        else ctx.setupLigandScene();
-
-        ctx.residueLabel.transition()
-            .duration(200)
-            .style('opacity', 0);
-    }
-
-    private resize(ctx: Visualization) {
-        ctx.svg
-            .attr('width', ctx.parent.offsetWidth)
-            .attr('height', ctx.parent.offsetHeight);
-
-        if (ctx.depiction === undefined) {
-            ctx.simulation
-                .force('center', d3.forceCenter(this.parent.offsetWidth / 2, this.parent.offsetHeight / 2))
-                .restart();
-        } else ctx.simulation.restart();
-
-        ctx.zoom_handler(ctx.svg);
-    }
-
-
-    public centerScene(ctx: Visualization) {
-        if (ctx.nodes.length === 0)
-            return;
-
-        // Get the bounding box
-        let minX: any = d3.min(ctx.nodes.data().map((x) => x.x));
-        let minY: any = d3.min(ctx.nodes.data().map((x) => x.y));
-
-        let maxX: any = d3.max(ctx.nodes.data().map((x) => x.x));
-        let maxY: any = d3.max(ctx.nodes.data().map((x) => x.y));
-
-        // The width and the height of the graph
-        let molWidth = maxX - minX;
-        let molHeight = maxY - minY;
-
-        // how much larger the drawing area is than the width and the height
-        let widthRatio = ctx.parent.offsetWidth / molWidth;
-        let heightRatio = ctx.parent.offsetHeight / molHeight;
-
-        // we need to fit it in both directions, so we scale according to
-        // the direction in which we need to shrink the most
-        let minRatio = Math.min(widthRatio, heightRatio) * 0.8;
-
-        // the new dimensions of the molecule
-        let newMolWidth = molWidth * minRatio;
-        let newMolHeight = molHeight * minRatio;
-
-        // translate so that it's in the center of the window
-        let xTrans = -(minX) * minRatio + (ctx.parent.offsetWidth - newMolWidth) / 2;
-        let yTrans = -(minY) * minRatio + (ctx.parent.offsetHeight - newMolHeight) / 2;
-
-        // do the actual moving
-        ctx.visualization.attr('transform', `translate(${xTrans}, ${yTrans}) scale(${minRatio})`);
-
-        // tell the zoomer what we did so that next we zoom, it uses the
-        // transformation we entered here        
-        ctx.zoom_handler.transform(ctx.svg, d3.zoomIdentity);
-
-
-
-    };
-    // #endregion menu functions
-
-    // #region mouse events
-    //https://stackoverflow.com/questions/40722344/understanding-d3-with-an-example-mouseover-mouseup-with-multiple-arguments
-    private fireNodeMouseEnterEvent(x: Model.InteractionNode, i: number, g: any) {
-        this.nodeHighlight(x, i, g);
-        this.fireNodeEvent(x, mouseoverEvent);
-    }
-
-    private fireNodeMouseLeaveEvent(x: Model.InteractionNode, i: number, g: any) {
-        this.nodeDim(x, i, g);
-
-        const e = new CustomEvent(mouseoutEvent, {
-            bubbles: true,
-            detail: {}
-        });
-        this.parent.dispatchEvent(e);
-    }
-
-    private fireLinkEvent(link: Model.Link, eventName: string) {
-        let atomsSource = [];
-        let atomsTarget = [];
-
-        if (link instanceof Model.LigandResidueLink) {
-            let tmpSrc = [].concat.apply([], link.interaction.map(x => x.sourceAtoms));
-            atomsSource = [].concat.apply([], tmpSrc).filter((v, i, a) => a.indexOf(v) === i);
-
-            let tmpTar = [].concat.apply([], link.interaction.map(x => x.targetAtoms));
-            atomsTarget = [].concat.apply([], tmpTar).filter((v, i, a) => a.indexOf(v) === i);
-        }
-
-        const e = new CustomEvent(eventName, {
-            bubbles: true,
-            detail: {
-                interacting_nodes: [
-                    {
-                        pdb_res_id: this.pdbId,
-                        auth_asym_id: link.source.residue.chainId,
-                        auth_seq_id: link.source.residue.authorResidueNumber,
-                        auth_ins_code_id: link.source.residue.authorInsertionCode,
-                        atoms: atomsSource
-                    },
-                    {
-                        pdb_res_id: this.pdbId,
-                        auth_asym_id: link.target.residue.chainId,
-                        auth_seq_id: link.target.residue.authorResidueNumber,
-                        auth_ins_code_id: link.target.residue.authorInsertionCode,
-                        atoms: atomsTarget
-                    }
-                ]
-            }
-        });
-
-        this.parent.dispatchEvent(e);
-    }
-
-    private fireNodeEvent(node: Model.InteractionNode, eventName: string) {
-        const e = new CustomEvent(eventName, {
-            bubbles: true,
-            detail: {
-                selected_node: {
-                    pdb_res_id: this.pdbId,
-                    auth_asym_id: node.residue.chainId,
-                    auth_seq_id: node.residue.authorResidueNumber,
-                    auth_ins_code_id: node.residue.authorInsertionCode
-                }
-            }
-        });
-
-        this.parent.dispatchEvent(e);
-    }
-
-    private fireLinkLeaveEvent() {
-        const e = new CustomEvent(mouseoutEvent, {
-            bubbles: true,
-            detail: {}
-        });
-
-        this.parent.dispatchEvent(e);
-    }
-
-    // #endregion mouse events
-
-    // #region Labels
-    private showLabel(x: Model.InteractionNode) {
-        this.residueLabel.transition()
-            .duration(200)
-            .style('opacity', .9);
-
-        this.residueLabel.html(x.toTooltip());
-    }
-    //#endregion labels
-
-    private selectLigand(n: Model.InteractionNode, i: number, g: any) {
-        this.fireNodeEvent(n, clickEvent);
-
-        if (!n.residue.isLigand) return;
-
-        this.visualization.remove();
-        this.fireNodeMouseLeaveEvent(n, i, g);
-        this.showLabel(n);
-
-        this.initialiseLigand(this.pdbId, n.residue.authorResidueNumber, n.residue.chainId);
-    }
-
-    private async setupLigandScene() {
-        this.addMarkers();
-
-        let xShift = (this.parent.offsetWidth / 2) - (this.depiction.resolution.x / 2);
-        let yShift = (this.parent.offsetHeight / 2) - (this.depiction.resolution.y / 2);
-
-        this.visualization = this.svg.append('g')
-            .attr('id', 'vis-root')
-            .append('g')
-            .attr('transform', `translate(${xShift}, ${yShift}) scale(1)`);
-
-        this.links = this.visualization.append('g')
-            .attr('id', 'links')
-            .selectAll()
-            .data(this.bindingSite.links)
-            .enter().append('g');
-
-        this.links
-            .append('line')
-            .classed('svg-shadow-bond', (x: Model.Link) => x.getLinkClass() !== 'hydrophobic')
-            .on('click', (x: Model.Link) => this.linkMouseClickEventHandler(x))
-            .on('mouseenter', (x: Model.Link) => this.linkMouseOverEventHandler(x))
-            .on('mouseleave', () => this.linkMouseOutEventHandler());
-
-        this.links
-            .append('line')
-            .attr('class', (e: Model.LigandResidueLink) => `svg-bond svg-bond-${e.getLinkClass()}`)
-            .attr('marker-mid', (e: Model.LigandResidueLink) => e.hasClash() ? 'url(#clash)' : '')
-
-        let depictionRoot = this.visualization.append('g').attr('id', 'depiction');
-        this.depiction.appendClarityNodes(depictionRoot)
-        this.depiction.appendBondVisualsTo(depictionRoot);
-        this.depiction.appendTextsTo(depictionRoot);
-
-        this.bindingSite.interactionNodes
-            .filter((x: Model.InteractionNode) => !x.residue.isLigand)
-            .forEach((x: Model.InteractionNode) => {
-                let lnks = this.bindingSite.links
-                    .filter((y: Model.LigandResidueLink) => y.containsInteractionNode(x))
-                    .map((y: Model.LigandResidueLink) => [].concat.apply([], y.interaction.map(z => z.sourceAtoms)));
-
-                let concated = [].concat.apply([], lnks);
-                let position: Vector2D = this.depiction.getInitalNodePosition(concated);
-
-                x.x = position.x + Math.random() * 110;
-                x.y = position.y + Math.random() * 110;
-            });
-
-
-        //setup nodes
-        this.nodes = this.visualization.append('g')
-            .attr('id', 'nodes')
-            .selectAll()
-            .data(this.bindingSite.interactionNodes)
-            .enter().append('g');
-
-        // draw glycans
-        await this.visualsMapper.graphicsPromise;
-        await this.visualsMapper.mappingPromise;
-
-        this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand)
-            .attr('class', (x: Model.InteractionNode) => `svg-node svg-${x.residue.getResidueType()}-res`)
-            .on('click', (x: Model.InteractionNode) => this.fireNodeEvent(x, clickEvent))
-            .on('mouseenter', (x: Model.InteractionNode, i: number, g: any) => this.fireNodeMouseEnterEvent(x, i, g))
-            .on('mouseleave', (x: Model.InteractionNode, i: number, g: any) => this.fireNodeMouseLeaveEvent(x, i, g));
-
-        this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand && this.visualsMapper.glycanMapping.has(x.residue.chemCompId))
-            .html((e: Model.InteractionNode) => this.visualsMapper.getGlycanImage(e.residue.chemCompId));
-
-        // draw rest
-        this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand && !this.visualsMapper.glycanMapping.has(x.residue.chemCompId))
-            .append('circle')
-            .attr('r', (x: Model.InteractionNode) => x.scale * 25);
-
-        this.nodes
-            .filter((x: Model.InteractionNode) => !x.residue.isLigand)
-            .append('text')
-            .style('text-anchor', 'middle')
-            .style('dominant-baseline', 'central')
-            .each(function (e: Model.InteractionNode) {
-                let labels = [e.residue.chemCompId, `${e.residue.chainId} ${e.residue.authorResidueNumber}`];
-                for (var i = 0; i < labels.length; i++) {
-                    d3.select(this)
-                        .append('tspan')
-                        .attr('dy', (i * 20) - 4)
-                        .attr('x', 0)
-                        .text(labels[i]);
-                }
-            });
-
-        //        let forceLink = d3.forceLink()
-        //            .links(visuals.links)
-        //            .distance(150)
-        //            .strength(0.5);
-
-        //let charge = d3.forceManyBody().strength(-1000).distanceMin(50).distanceMax(150);
-        let collision = d3.forceCollide().radius(50)
-        //let center = d3.forceCenter(xShift, yShift);
-
-        this.simulation = d3.forceSimulation(this.bindingSite.interactionNodes)
-            //            .force('link', forceLink)
-            //            .force('charge', charge) //strength 
-            .force('collision', collision)
-            //                    .force('center', center)
-            .on('tick', () => this.simulationStep(this));
-
-        this.drag_handler(this.nodes);
-        this.zoom_handler(this.svg);
-        this.centerScene(this);
-    }
-
-    private async setupScene() {
-        let context = this;
-
-        this.visualization = this.svg.append('g').attr('id', 'vis-root');
-        this.links = this.visualization.append('g')
-            .attr('id', 'links')
-            .selectAll()
-            .data(context.bindingSite.links)
-            .enter().append('g')
-
-        this.links
-            .append('line')
-            .classed('svg-shadow-bond', (x: Model.Link) => x.getLinkClass() !== 'hydrophobic')
-            .attr('class', 'svg-shadow-bond')
-            .on('click', (x: Model.Link) => this.linkMouseClickEventHandler(x))
-            .on('mouseover', (x: Model.Link) => this.linkMouseOverEventHandler(x))
-            .on('mouseout', (x: Model.Link) => this.linkMouseOverEventHandler(x));
-
-        this.links
-            .append('line')
-            .attr('class', (x: Model.Link) => `svg-bond svg-bond-${x.getLinkClass()}`)
-            .attr('marker-end', (x: Model.Link) => `url(#arrow-${x.getLinkClass()})`);
-
-        this.nodes = this.visualization.append('g')
-            .attr('id', 'nodes')
-            .selectAll()
-            .data(this.bindingSite.interactionNodes)
-            .enter().append('g')
-            .attr('class', (e: Model.InteractionNode) => `svg-node svg-${e.residue.getResidueType()}-res`)
-            .on('click', (x: Model.InteractionNode, i: number, g: any) => this.selectLigand(x, i, g))
-            .on('mouseover', (x: Model.InteractionNode, i: number, g: any) => this.fireNodeMouseEnterEvent(x, i, g))
-            .on('mouseout', (x: Model.InteractionNode, i: number, g: any) => this.fireNodeMouseLeaveEvent(x, i, g));
-
-
-        await this.visualsMapper.graphicsPromise;
-        await this.visualsMapper.mappingPromise;
-
-        this.nodes.filter((n: Model.InteractionNode) =>
-            this.visualsMapper.glycanMapping.has(n.residue.chemCompId))
-            .html((e: Model.InteractionNode) => this.visualsMapper.getGlycanImage(e.residue.chemCompId));
-
-        this.nodes.filter((e: Model.InteractionNode) => !this.visualsMapper.glycanMapping.has(e.residue.chemCompId))
-            .append('circle')
-            .attr('r', '25');
-
-        this.nodes.append('text')
-            .style('text-anchor', 'middle')
-            .style('dominant-baseline', 'central')
-            .each(function (e: Model.InteractionNode) {
-                let labels = [e.residue.chemCompId, `${e.residue.chainId} ${e.residue.authorResidueNumber}`];
-                for (var i = 0; i < labels.length; i++) {
-                    d3.select(this)
-                        .append('tspan')
-                        .attr('dy', (i * 20) - 4)
-                        .attr('x', 0)
-                        .text(labels[i]);
-                }
-            });
-
-        let forceLink = d3.forceLink()
-            .links(this.bindingSite.links)
-            .distance((x: Model.Link) => (<Model.InteractionNode>x.source).residue.isLigand && (<Model.InteractionNode>x.target).residue.isLigand ? 55 : 150)
-            .strength(0.5);
-
-        let charge = d3.forceManyBody().strength(-1000).distanceMin(55).distanceMax(250);
-        let collision = d3.forceCollide(45);
-        let center = d3.forceCenter(this.parent.offsetWidth / 2, this.parent.offsetHeight / 2);
-
-        this.simulation = d3.forceSimulation(this.bindingSite.interactionNodes)
-            .force('link', forceLink)
-            .force('charge', charge) //strength 
-            .force('collision', collision)
-            .force('center', center)
-            .on('tick', () => this.simulationStep(this));
-
-        this.drag_handler(this.nodes);
-        this.zoom_handler(this.svg);
-    }
-
-    private simulationStep(ctx: Visualization) {
-        ctx.nodes.attr('transform', (d) => `translate(${d.x},${d.y}) scale(${d.scale})`);
-        ctx.links.selectAll('line').attr('x1', (x: any) => x.source.x)
-            .attr('y1', (x: any) => x.source.y)
-            .attr('x2', (x: any) => x.target.x)
-            .attr('y2', (x: any) => x.target.y);
-    }
-
-    private nodeHighlight(x: Model.InteractionNode, i: number, g: any) {
-        x.scale = 1.5;
-
-        if (x.residue.isLigand) d3.select(g[i]).style('cursor', 'pointer');
-        d3.select(g[i])
-            .attr('transform', () => `translate(${x.x},${x.y}) scale(${x.scale})`);
-
-        this.tooltip.transition()
-            .duration(200)
-            .style('opacity', .9);
-
-        this.tooltip.html(x.toTooltip());
-    }
-
-    private nodeDim(x: Model.InteractionNode, i: number, g: any) {
-        x.scale = 1.0;
-
-        if (x.residue.isLigand) d3.select(g[i]).style('cursor', 'default');
-        d3.select(g[i])
-            .attr('transform', `translate(${x.x},${x.y}) scale(${x.scale})`);
-
-        this.tooltip.transition()
-            .duration(200)
-            .style('opacity', 0);
-    }
-
-    private addMarkers() {
-        // let mapping = new Map<string, string>([
-        //     // ["arrow-electrostatic", "#3F26BF"],
-        //     // ["arrow-vdw", "#9B7653"],
-        //     // ["arrow-metal", "#008080"],
-        //     // ["arrow-aromatic", "#AD4379"],
-        // ]);
-        this.svg
-            .append('defs')
-            .append('marker')
-            .attr('id', 'clash')
-            .attr("markerWidth", 15)
-            .attr("markerHeight", 15)
-            .attr("refX", 7)
-            .attr("refY", 3)
-            .attr("orient", "auto")
-            .attr('markerUnits', 'strokeWidth')
-
-            .append('path')
-            .attr('d', 'M22.245,4.015c0.313,0.313,0.313,0.826,0,1.139l-6.276,6.27c-0.313,0.312-0.313,0.826,0,1.14l6.273,6.272  c0.313,0.313,0.313,0.826,0,1.14l-2.285,2.277c-0.314,0.312-0.828,0.312-1.142,0l-6.271-6.271c-0.313-0.313-0.828-0.313-1.141,0  l-6.276,6.267c-0.313,0.313-0.828,0.313-1.141,0l-2.282-2.28c-0.313-0.313-0.313-0.826,0-1.14l6.278-6.269  c0.313-0.312,0.313-0.826,0-1.14L1.709,5.147c-0.314-0.313-0.314-0.827,0-1.14l2.284-2.278C4.308,1.417,4.821,1.417,5.135,1.73  L11.405,8c0.314,0.314,0.828,0.314,1.141,0.001l6.276-6.267c0.312-0.312,0.826-0.312,1.141,0L22.245,4.015z')
-            .attr('style', 'stroke:#FF5050;stroke-width:3px;');
-
-        // mapping.forEach((x, y) =>
-        //     d3.select('defs').append('marker')
-        //         .attr('id', y)
-        //         .attr("markerWidth", 15)
-        //         .attr("markerHeight", 15)
-        //         .attr("refX", 7)
-        //         .attr("refY", 3)
-        //         .attr("orient", "auto")
-        //         .attr('markerUnits', 'strokeWidth')
-        //         .attr('viewBox', '0 0 20 20')
-        //         .append('path')
-        //         .attr('d', 'M0,0 L0,6 L9,3 z')
-        //         .attr('fill', x)
-        // );    
-    }
-}
-
diff --git a/src/plugin/config.ts b/src/plugin/config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3aa0c4ab3b88b5a39947db0a6d75c1ccc46da644
--- /dev/null
+++ b/src/plugin/config.ts
@@ -0,0 +1,86 @@
+namespace Config {
+    export const nodeSize: number = 30;
+    export const interactionClickEvent: string = 'PDB.interactions.click';
+    export const interactionMouseoverEvent: string = 'PDB.interactions.mouseover';
+    export const interactionMouseoutEvent: string = 'PDB.interactions.mouseout'
+
+    export const interactionShowLabelEvent: string = 'PDB.interactions.showLabel';
+    export const interactionHideLabelEvent: string = 'PDB.interactions.hideLabel';
+
+    export const molstarClickEvent: string = 'PDB.molstar.click';
+    export const molstarMouseoverEvent: string = 'PDB.molstar.mouseover';
+    export const molstarMouseoutEvent: string = 'PDB.molstar.mouseout';
+
+    export const aaTypes = new Map<string, Array<string>>([
+        ['hydrophobic', new Array<string>('A', 'I', 'L', 'M', 'F', 'W', 'V')],
+        ['positive', Array<string>('K', 'R', 'O')],
+        ['negative', Array<string>('E', 'D')],
+        ['polar', Array<string>('N', 'Q', 'S', 'T')],
+        ['cystein', Array<string>('C', 'U')],
+        ['glycine', Array<string>('G')],
+        ['proline', Array<string>('P')],
+        ['aromatic', Array<string>('H', 'Y')]
+    ]);
+    
+    export const aaAbreviations = new Map<string, string>([
+        ['ALA', 'A'],
+        ['ARG', 'R'],
+        ['ASN', 'N'],
+        ['ASP', 'D'],
+        ['CYS', 'C'],
+        ['GLU', 'E'],
+        ['GLN', 'Q'],
+        ['GLY', 'G'],
+        ['HIS', 'H'],
+        ['ILE', 'I'],
+        ['LEU', 'L'],
+        ['LYS', 'K'],
+        ['MET', 'M'],
+        ['PHE', 'F'],
+        ['PRO', 'P'],
+        ['SER', 'S'],
+        ['THR', 'T'],
+        ['TRP', 'W'],
+        ['TYR', 'Y'],
+        ['VAL', 'V']
+    ]);
+
+    export const backboneAtoms: Array<string> = ['N', 'CA', 'C', 'O'];
+
+    export const interactionsClasses = new Map<string, Array<string>>([
+        ["covalent", new Array<string>("covalent")],
+        ["electrostatic", new Array<string>("ionic", "hbond", "weak_hbond", "polar", "weak_polar", "xbond", "carbonyl")],
+        ['amide', new Array<string>("AMIDEAMIDE", "AMIDERING")],
+        ["vdw", new Array<string>("vdw")],
+        ["hydrophobic", new Array<string>("hydrophobic")],
+        ["aromatic", new Array<string>("aromatic", "FF", "OF", "EE", "FT", "OT", "ET", "FE", "OE", "EF")],
+        ["atom-pi", new Array<string>("CARBONPI", "CATIONPI", "DONORPI", "HALOGENPI", "METSULPHURPI")],
+        ["metal", new Array<string>("metal_complex")],
+        ["clashes", new Array<string>("clash", "vdw_clash")]
+    ]);
+
+    export class UIParameters {
+        reinitialize: boolean;
+        zoom: boolean;
+        fullScreen: boolean;
+        downloadImage: boolean;
+        downloadData: boolean;
+        center: boolean;
+        help: boolean;
+        residueLabel: boolean;
+        tooltip: boolean;
+
+        constructor() {
+            this.reinitialize = true;
+            this.zoom = true;
+            this.fullScreen = true;
+            this.downloadImage = true;
+            this.downloadData = true;
+            this.center = true;
+            this.help = true;
+            this.residueLabel = true;
+            this.tooltip = true;
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/depiction.ts b/src/plugin/depiction.ts
similarity index 80%
rename from src/depiction.ts
rename to src/plugin/depiction.ts
index 85052471d3f1682e933bd6137e21ae91883f12b4..91b1d14941ef735972a584b1167d7e30b1b0c887 100644
--- a/src/depiction.ts
+++ b/src/plugin/depiction.ts
@@ -17,9 +17,21 @@ class Depiction {
     ccdId: string;
     atoms: Atom[];
     bonds: Bond[];
+
     resolution: Vector2D;
 
-    constructor(data: any) {
+    private root: d3.Selection<SVGGElement, unknown, null, undefined>;
+    private structure: d3.Selection<SVGGElement, unknown, null, undefined>;
+    private contour: d3.Selection<SVGGElement, unknown, null, undefined>;
+    private highlight: d3.Selection<SVGGElement, unknown, null, undefined>;
+
+    constructor(parent: any, data: any) {
+        this.root = parent
+
+        this.highlight = this.root.append('g').attr('id', 'highlight');
+        this.structure = this.root.append('g').attr('id', 'structure');
+        this.contour = this.root.append('g').attr('id', 'contour');
+
         this.ccdId = data.ccd_id;
         this.resolution = new Vector2D(data.resolution.x, data.resolution.y);
 
@@ -76,16 +88,55 @@ class Depiction {
         return new Vector2D(x, y);
     }
 
+    public draw(withClarityNodes: boolean = false) {
+        this.structure.selectAll("*").remove();
+
+        if (withClarityNodes) this.appendClarityNodes();
+        this.appendBondVisuals();
+        this.appendTexts();
+    }
+
+    public highlightSubgraph(atoms: Array<string>, color: string = undefined) {
+        if (!this.atoms || !atoms) return;        
+
+        this.highlight.selectAll('*').remove();
+
+        color = color ? color : "#BFBFBF";
+        let atomsToHighlight = this.atoms.filter(x => atoms.includes(x.name));
+        
+        this.highlight.selectAll()
+            .data(atomsToHighlight)
+            .enter()
+            .append('circle')
+            .attr('r', '16.12')
+            .attr('cx', x => x.position.x)
+            .attr('cy', x => x.position.y)
+            .attr('style', `fill:${color};fill-rule:evenodd;stroke:${color};stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1`);
+
+        let bondsToHighlight = this.bonds.filter(x => atoms.includes(x.bgn.name) && atoms.includes(x.end.name))
+
+        this.highlight.selectAll()
+            .data(bondsToHighlight)
+            .enter()
+            .append('path')
+            .attr('d', x => `M ${x.bgn.position.x},${x.bgn.position.y} ${x.end.position.x},${x.end.position.y}`)
+            .attr('style', `fill:none;fill-rule:evenodd;stroke:${color};stroke-width:22px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1`)
+    }
+
+    public addContour(data: any) { 
+        this.contour.selectAll('*').remove();
+
+        this.contour.append('div').text(`'contour data goes here: ${data}`);
+    }
 
     /**
      * Appends to a given selection the visual representation of bonds as svg:path elements.
      *
-     * @param {d3.Selection<d3.BaseType, {}, HTMLElement, any>} selection where to append SVG
      * representation of the bond visuals.
      * @memberof Depiction
      */
-    public appendBondVisualsTo(root: d3.Selection<d3.BaseType, {}, HTMLElement, any>): void {
-        root.selectAll()
+    private appendBondVisuals(): void {
+        this.structure.selectAll()
             .data(this.bonds)
             .enter()
             .append('path')
@@ -100,12 +151,10 @@ class Depiction {
      * Also there are all sorts of colorful subscripts and superscripts, 
      * so it is much easier to use it this way.
      *
-     * @param {d3.Selection<d3.BaseType, {}, HTMLElement, any>} root where to append SVG
-     * representation of compounds' labels. 
      * @memberof Depiction
      */
-    public appendTextsTo(root: any): void {
-        root.selectAll()
+    private appendTexts(): void {
+        this.structure.selectAll()
             .data(this.atoms.filter(x => Object.keys(x.label).length !== 0).map(x => x.label))
             .enter()
             .append('text')
@@ -126,23 +175,22 @@ class Depiction {
      * Add small white circle on the background of atoms with label
      * just to make the interaction lines pretty.
      *
-     * @param {*} root
      * @memberof Depiction
      */
-    public appendClarityNodes(root: any): void {
-        root.selectAll()
+    private appendClarityNodes(): void {
+        this.structure.selectAll()
             .data(this.atoms.filter(x => Object.keys(x.label).length != 0))
             .enter().append('circle')
-            .attr('class', 'svg-shadow-node')
+            .classed('pdb-lig-env-svg-shadow-node', true)
             .attr('cx', (x: any) => x.position.x)
             .attr('cy', (x: any) => x.position.y)
             .attr('r', 15);
-
     }
 
 
     public getCenter(ids: string[]): Vector2D {
         let coords = new Array<Vector2D>();
+        
         ids.forEach(x => {
             let pos = this.atoms.find(y => y.name === x).position;
             coords.push(pos);
diff --git a/src/plugin/manager.ts b/src/plugin/manager.ts
new file mode 100644
index 0000000000000000000000000000000000000000..061ec174054fe9cdc15148ab49a410c6a2140afc
--- /dev/null
+++ b/src/plugin/manager.ts
@@ -0,0 +1,841 @@
+
+class Visualization {
+    // component related
+    private parent: HTMLElement;
+
+    // #region svg properties
+    private simulation: d3.Simulation<d3.SimulationNodeDatum, undefined>;
+    private svg: d3.Selection<any, {}, HTMLElement, any>;
+    private canvas: d3.Selection<SVGGElement, {}, HTMLElement, any>;
+
+    private depictionRoot: d3.Selection<SVGGElement, {}, HTMLElement, any>;
+    private nodesRoot: d3.Selection<SVGGElement, {}, HTMLElement, any>;
+    private linksRoot: d3.Selection<SVGGElement, {}, HTMLElement, any>;
+
+    private zoomHandler: d3.ZoomBehavior<Element, unknown>
+
+    private nodes: any;
+    private links: any;
+    // #endregion
+
+    // #region data properties    
+    private pdbId: string;
+    private bindingSite: Model.BindingSite;
+    private depiction: Depiction;
+
+    private visualsMapper: VisualsMapper;
+    private interactionsData: any;
+    private selectedResidueHash: string;
+
+    private rProvider: ResidueProvider;
+
+    public fullScreen: boolean;
+    // #endregion
+
+    constructor(element: HTMLElement, uiParameters: Config.UIParameters = undefined) {
+        this.parent = element;
+        this.parent.style.cssText += "display: block; height: 100%; width: 100%; position: relative;";
+
+        this.visualsMapper = new VisualsMapper();
+        this.rProvider = ResidueProvider.getInstance();
+        this.fullScreen = false;
+
+        if (uiParameters === undefined) uiParameters = new Config.UIParameters();
+
+        new UI(this.parent, this).register(uiParameters);
+
+        this.svg = d3.select(this.parent)
+            .append('div')
+            .attr('id', 'pdb-lig-env-root')
+            .append('svg')
+            .style('background-color', 'white')
+            .attr('xmlns', 'http://www.w3.org/2000/svg')
+            .attr('width', '100%')
+            .attr('height', '100%');
+
+        this.canvas = this.svg.append('g').attr('id', 'vis-root');
+        this.linksRoot = this.canvas.append('g').attr('id', 'links');
+        this.depictionRoot = this.canvas.append('g').attr('id', 'depiction');
+        this.nodesRoot = this.canvas.append('g').attr('id', 'nodes');
+
+        if (uiParameters.zoom) this.zoomHandler = this.getZoomHandler();
+
+        document.addEventListener(Config.molstarClickEvent, e => this.nodeMouseEnterEventHandler(e));
+        document.addEventListener(Config.molstarMouseoverEvent, e => this.nodeMouseEnterEventHandler(e));
+        document.addEventListener(Config.molstarMouseoutEvent, () => this.nodeMouseLeaveEventHandler());
+
+        d3.select(this.parent).on('resize', () => this.resize());
+        this.addMarkers();
+    }
+
+    // #region even handlers
+    private getZoomHandler() {
+        return d3.zoom()
+            .scaleExtent([1 / 10, 10])
+            .on('zoom', () => this.canvas
+                .attr('transform', d3.event.transform));
+    }
+
+
+    private nodeMouseEnterEventHandler(e: any) {
+        if (this.fullScreen) return;
+
+        let hash = `${e.eventData.auth_asym_id}${e.eventData.auth_seq_id}${e.eventData.ins_code}`;
+
+        this.nodes?.each((node: Model.InteractionNode, index: number, group: any) => {
+            if (node.id === hash) {
+                this.selectedResidueHash = hash;
+                this.nodeHighlight(node, index, group);
+                return;
+            }
+        });
+
+    }
+
+
+    private nodeMouseLeaveEventHandler() {
+        if (this.fullScreen) return;
+
+        this.nodes?.each((node: Model.InteractionNode, index: number, group: any) => {
+            if (node.id == this.selectedResidueHash) {
+                this.nodeDim(node, index, group);
+                return;
+            }
+        });
+    }
+
+    private linkMouseClickEventHandler(x: Model.Link) {
+        this.fireExternalLinkEvent(x, Config.interactionClickEvent);
+    }
+
+    private linkMouseOverEventHandler(x: Model.Link) {
+        this.fireExternalLinkEvent(x, Config.interactionMouseoverEvent);
+    }
+
+    private linkMouseOutEventHandler() {
+        this.fireExternalLinkLeaveEvent();
+    }
+
+    private dragHandler = d3.drag()
+        .filter((x: Model.InteractionNode) => !x.static)
+        .on('start', (x: Model.InteractionNode) => {
+            if (!d3.event.active) this.simulation.alphaTarget(0.3).restart();
+
+            x.fx = x.x;
+            x.fy = x.y;
+        })
+        .on('drag', (x: Model.InteractionNode) => {
+            x.fx = d3.event.x;
+            x.fy = d3.event.y;
+        })
+        .on('end', (x: Model.InteractionNode) => {
+            if (!d3.event.active) this.simulation.alphaTarget(0);
+            x.fx = d3.event.x;
+            x.fy = d3.event.y;
+        });
+
+    // #endregion event handlers
+
+    // #region public methods
+    /**
+     * Download bound molecule interactions data from PDBe Graph API end point
+     * /pdb/bound_molecule_interactions
+     * 
+     * Correct parameters can be obtained using API call:
+     * /pdb/bound_molecules
+     *
+     * @param {string} pdbid
+     * @param {string} bmId bound molecule identifier: e.g. bm1, bm2, ...
+     * @memberof Visualization
+     */
+    public initBoundMoleculeInteractions(pdbid: string, bmId: string) {
+        this.pdbId = pdbid;
+        let url = Resources.boundMoleculeAPI(pdbid, bmId);
+
+        d3.json(url)
+            .catch(e => this.processError(e, 'No interactions to display'))
+            .then((data: any) => this.addBoundMoleculeInteractions(data, bmId))
+            .then(() => new Promise(resolve => setTimeout(resolve, 1500)))
+            .then(() => this.centerScene());
+    }
+
+    /**
+     * Download ligand interactions data from PDBe Graph API end point
+     * /pdb/bound_ligand_interactions.
+     * 
+     * Correct parameters can be obtained using API call:
+     * /pdb/bound_molecules
+     * 
+     * @param {string} pdbId pdb id
+     * @param {number} resId residue number aka: auth_seq_id
+     * @param {string} chainId chain id aka: auth_asym_id
+     * @memberof Visualization
+     */
+    public initLigandInteractions(pdbId: string, resId: number, chainId: string) {
+        this.pdbId = pdbId;
+        let url = Resources.ligandInteractionsAPI(pdbId, chainId, resId);
+
+        d3.json(url)
+            .catch(e => this.processError(e, 'No interactions to display'))
+            .then((data: any) => this.addLigandInteractions(data))
+            .then(() => new Promise(resolve => setTimeout(resolve, 1500)))
+            .then(() => this.centerScene());
+    }
+
+    /**
+     * Download ligand structure given the anotation generated by the 
+     * PDBeChem process.
+     *
+     * @param {string} ligandId
+     * @returns
+     * @memberof Visualization
+     */
+    public async initLigandDisplay(ligandId: string) {
+        const ligandUrl = Resources.ligandAnnotationAPI(ligandId);
+
+        return d3.json(ligandUrl)
+            .catch(e => this.processError(e, `Depiction ${ligandId} not found`))
+            .then((d: any) => this.addDepiction(d, true))
+            .then(() => this.centerScene());
+    }
+
+
+    /**
+     * Add depiction to the canvas from external resource.
+     *
+     * @param {*} depiction Content of annotation.json file generated by
+     * the PDBeChem process.
+     * @param {*} withClarityNodes Control if shadow nodes should be drawn
+     * in the background of nodes with labels
+     * @memberof Visualization
+     */
+    public addDepiction(depiction: any, withClarityNodes: boolean) {
+        this.depiction = new Depiction(this.depictionRoot, depiction);
+        this.depiction.draw(withClarityNodes);
+    }
+
+
+    /**
+     * Add atom highlight to the ligand structure. The previous highlight
+     * is going to be removed.
+     *
+     * @param {string[]} highlight List of atom names to be highlighted.
+     * @param {string} [color=undefined] Color in #HEXHEX format.
+     * @memberof Visualization
+     */
+    public addLigandHighlight(highlight: string[], color: string = undefined) {
+        this.depiction.highlightSubgraph(highlight, color);
+    }
+
+    /**
+     * Add contours to the ligand structure. The previous contours are
+     * going to be removed.
+     *
+     * @param {*} data
+     * @memberof Visualization
+     */
+    public addContours(data: any) {
+        this.depiction.addContour(data);
+    }
+
+
+    public toogleZoom(active: boolean) {
+        if (active) {
+            this.zoomHandler = this.getZoomHandler();
+        } else {
+            this.zoomHandler = undefined;
+        }
+    }
+
+
+    /**
+     * Add ligand interactions to the canvas
+     *
+     * @param {*} data Data content of the API end point 
+     * /pdb/bound_ligand_interactions
+     * @memberof Visualization
+     */
+    public addLigandInteractions(data: any) {
+        let key = Object.keys(data)[0];
+        let body = data[key][0];
+        this.interactionsData = data;
+
+        if (this.depiction === undefined || this.depiction.ccdId !== body.ligand.chem_comp_id) {
+            this.initLigandDisplay(body.ligand.chem_comp_id).then(() => {
+                this.bindingSite = new Model.BindingSite().fromLigand(key, body, this.depiction);
+                this.setupLigandScene();
+            });
+        } else {
+            this.bindingSite = new Model.BindingSite().fromLigand(key, body, this.depiction);
+            this.setupLigandScene();
+        }
+    }
+
+
+    /**
+     * Add bound molecule interactions to the canvas.
+     *
+     * @param {*} data Data content of the API end point 
+     * /pdb/bound_molecule_interactions
+     * @param {string} bmId Bound molecule id
+     * @memberof Visualization
+     */
+    public addBoundMoleculeInteractions(data: any, bmId: string) {
+        let key = Object.keys(data)[0];
+        this.interactionsData = data;
+
+        this.bindingSite = new Model.BindingSite().fromBoundMolecule(key, data[key][0]);
+        this.bindingSite.bmId = bmId;
+        let ligands = this.bindingSite.residues.filter(x => x.isLigand);
+
+        if (ligands.length === 1) this.initLigandInteractions(this.pdbId, ligands[0].authorResidueNumber, ligands[0].chainId);
+        else this.setupScene();
+    }
+
+
+    // #region menu functions
+    public saveSvg() {
+        d3.text(Resources.componentSvgCss)
+            .then(x => {
+                let svgData = `
+                <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" style="background-color: white;">
+                ${this.svg.html()}
+                <style>
+                /* <![CDATA[ */ \n ${x} \n /* ]]> */
+                </style>
+                </svg>`;
+
+                let svgBlob = new Blob([svgData], { type: 'image/svg;charset=utf-8' });
+                let svgUrl = URL.createObjectURL(svgBlob);
+                let downloadLink = document.createElement('a');
+
+                downloadLink.href = svgUrl;
+                downloadLink.download = this.getSVGName();
+
+                document.body.appendChild(downloadLink);
+                downloadLink.click();
+                document.body.removeChild(downloadLink);
+            });
+    }
+
+
+    /**
+     * Download interactions data in the JSON format.
+     *
+     * @memberof Visualization
+     */
+    public downloadInteractionsData(): void {
+        let downloadLink = document.createElement('a');
+        let dataBlob = new Blob([JSON.stringify(this.interactionsData, null, 4)], { type: 'application/json' });
+
+        downloadLink.href = URL.createObjectURL(dataBlob);
+        downloadLink.download = this.interactionsData === undefined ? 'no name.json' : `${this.pdbId}_${this.bindingSite.bmId}_interactions.json`;
+        document.body.appendChild(downloadLink);
+        downloadLink.click();
+        document.body.removeChild(downloadLink);
+    }
+
+
+    /**
+     * Reinitialize the scene (basicaly rerun the simulation to place interaction partners)
+     *
+     * @memberof Visualization
+     */
+    public reinitialize() {
+        if (this.depiction === undefined) this.setupScene();
+        else this.setupLigandScene();
+
+        this.hideLigandLabel();
+    }
+
+
+
+    /**
+     * Center scene to the viewbox
+     *
+     * @memberof Visualization
+     */
+    public centerScene() {
+        // Get the bounding box
+        if (this.nodes !== undefined) {
+            let minX: any = d3.min(this.nodes.data().map((x) => x.x));
+            let minY: any = d3.min(this.nodes.data().map((x) => x.y));
+
+            let maxX: any = d3.max(this.nodes.data().map((x) => x.x));
+            let maxY: any = d3.max(this.nodes.data().map((x) => x.y));
+
+            this.computeBoundingBox(minX, maxX, minY, maxY);
+
+        } else if (this.depiction !== undefined) {
+            let minX: any = d3.min(this.depiction.atoms.map((x: Atom) => x.position.x));
+            let minY: any = d3.min(this.depiction.atoms.map((x: Atom) => x.position.y));
+
+            let maxX: any = d3.max(this.depiction.atoms.map((x: Atom) => x.position.x));
+            let maxY: any = d3.max(this.depiction.atoms.map((x: Atom) => x.position.y));
+
+            this.computeBoundingBox(minX, maxX, minY, maxY);
+        }
+    }
+
+    private computeBoundingBox(minX: number, maxX: number, minY: number, maxY: number) {
+        // The width and the height of the graph
+        let molWidth = maxX - minX;
+        let molHeight = maxY - minY;
+
+        // how much larger the drawing area is than the width and the height
+        let widthRatio = this.parent.offsetWidth / molWidth;
+        let heightRatio = this.parent.offsetHeight / molHeight;
+
+        // we need to fit it in both directions, so we scale according to
+        // the direction in which we need to shrink the most
+        let minRatio = Math.min(widthRatio, heightRatio) * 0.85;
+
+        // the new dimensions of the molecule
+        let newMolWidth = molWidth * minRatio;
+        let newMolHeight = molHeight * minRatio;
+
+        // translate so that it's in the center of the window
+        let xTrans = -(minX) * minRatio + (this.parent.offsetWidth - newMolWidth) / 2;
+        let yTrans = -(minY) * minRatio + (this.parent.offsetHeight - newMolHeight) / 2;
+
+        // do the actual moving
+        this.canvas.attr('transform', `translate(${xTrans}, ${yTrans}) scale(${minRatio})`);
+
+        // tell the zoomer what we did so that next we zoom, it uses the
+        // transformation we entered here        
+
+        let translation = d3.zoomIdentity.translate(xTrans, yTrans).scale(minRatio);
+        this.zoomHandler?.transform(this.svg, translation);
+
+    };
+
+    // #endregion menu functions
+
+    // #endregion public methods
+
+    private resize() {
+        this.svg
+            .attr('width', this.parent.offsetWidth)
+            .attr('height', this.parent.offsetHeight);
+
+        if (this.depiction === undefined) {
+            this.simulation
+                .force('center', d3.forceCenter(this.parent.offsetWidth / 2, this.parent.offsetHeight / 2))
+                .restart();
+        } else this.simulation.restart();
+
+        if (this.zoomHandler !== undefined) this.zoomHandler(this.svg);
+    }
+
+    private getSVGName(): string {
+        if (this.bindingSite !== undefined) return `${this.bindingSite.bmId}.svg`;
+        if (this.depiction !== undefined) return `${this.depiction.ccdId}.svg`;
+
+        return 'blank.svg';
+    }
+
+    // #region fire events
+
+    //https://stackoverflow.com/questions/40722344/understanding-d3-with-an-example-mouseover-mouseup-with-multiple-arguments
+    private fireExternalNodeMouseEnterEvent(x: Model.InteractionNode, i: number, g: any) {
+        this.nodeHighlight(x, i, g);
+        this.fireExternalNodeEvent(x, Config.interactionMouseoverEvent);
+    }
+
+    private fireExternalNodeMouseLeaveEvent(x: Model.InteractionNode, i: number, g: any) {
+        this.nodeDim(x, i, g);
+
+        const e = new CustomEvent(Config.interactionMouseoutEvent, {
+            bubbles: true,
+            detail: {}
+        });
+        this.parent.dispatchEvent(e);
+    }
+
+    private fireExternalLinkEvent(link: Model.Link, eventName: string) {
+        let atomsSource = [];
+        let atomsTarget = [];
+
+        if (link instanceof Model.LigandResidueLink) {
+            let tmpSrc = [].concat.apply([], link.interaction.map(x => x.sourceAtoms));
+            atomsSource = [].concat.apply([], tmpSrc).filter((v, i, a) => a.indexOf(v) === i);
+
+            let tmpTar = [].concat.apply([], link.interaction.map(x => x.targetAtoms));
+            atomsTarget = [].concat.apply([], tmpTar).filter((v, i, a) => a.indexOf(v) === i);
+        }
+
+        const e = new CustomEvent(eventName, {
+            bubbles: true,
+            detail: {
+                interacting_nodes: [
+                    {
+                        pdb_res_id: this.pdbId,
+                        auth_asym_id: link.source.residue.chainId,
+                        auth_seq_id: link.source.residue.authorResidueNumber,
+                        auth_ins_code_id: link.source.residue.authorInsertionCode,
+                        atoms: atomsSource
+                    },
+                    {
+                        pdb_res_id: this.pdbId,
+                        auth_asym_id: link.target.residue.chainId,
+                        auth_seq_id: link.target.residue.authorResidueNumber,
+                        auth_ins_code_id: link.target.residue.authorInsertionCode,
+                        atoms: atomsTarget
+                    }
+                ],
+                tooltip: link.toTooltip()
+            }
+        });
+
+        this.parent.dispatchEvent(e);
+    }
+
+    private fireExternalNodeEvent(node: Model.InteractionNode, eventName: string) {
+        const e = new CustomEvent(eventName, {
+            bubbles: true,
+            detail: {
+                selected_node: {
+                    pdb_res_id: this.pdbId,
+                    auth_asym_id: node.residue.chainId,
+                    auth_seq_id: node.residue.authorResidueNumber,
+                    auth_ins_code_id: node.residue.authorInsertionCode
+                },
+                tooltip: node.toTooltip()
+            }
+        });
+
+        this.parent.dispatchEvent(e);
+    }
+
+    private fireExternalLinkLeaveEvent() {
+        const e = new CustomEvent(Config.interactionMouseoutEvent, {
+            bubbles: true,
+            detail: {}
+        });
+
+        this.parent.dispatchEvent(e);
+    }
+
+    // #endregion fire events
+
+
+    //#region setup scene micromethods
+    private wipeOutVisuals() {
+        this.nodesRoot.selectAll('*').remove();
+        this.linksRoot.selectAll('*').remove();
+    }
+
+    private setupLinks() {
+        this.links = this.linksRoot
+            .selectAll()
+            .data(this.bindingSite.links)
+            .enter().append('g');
+
+        this.links
+            .append('line')
+            .classed('pdb-lig-env-svg-shadow-bond', (x: Model.Link) => x.getLinkClass() !== 'hydrophobic')
+            .on('click', (x: Model.Link) => this.linkMouseClickEventHandler(x))
+            .on('mouseenter', (x: Model.Link) => this.linkMouseOverEventHandler(x))
+            .on('mouseleave', () => this.linkMouseOutEventHandler());
+
+        this.links
+            .append('line')
+            .attr('class', (e: Model.Link) => `pdb-lig-env-svg-bond pdb-lig-env-svg-bond-${e.getLinkClass()}`)
+            .attr('marker-mid', (e: Model.Link) => e.hasClash() ? 'url(#clash)' : '')
+            .on('mouseenter', (x: Model.Link) => this.linkMouseOverEventHandler(x))
+            .on('mouseleave', () => this.linkMouseOutEventHandler());
+    }
+
+
+
+    private addNodeLabels(selection: any) {
+        selection
+            .append('text')
+            .style('text-anchor', 'middle')
+            .style('dominant-baseline', 'central')
+            .each(function (e: Model.InteractionNode) {
+                let labels = [e.residue.chemCompId, `${e.residue.chainId} ${e.residue.authorResidueNumber}`];
+                for (var i = 0; i < labels.length; i++) {
+                    d3.select(this)
+                        .append('tspan')
+                        .attr('dy', (i * 20) - 4)
+                        .attr('x', 0)
+                        .text(labels[i]);
+                }
+            });
+    }
+    //#endregion
+
+    /**
+     * Initialize scene after user selected a part of bound molecule.
+     *
+     * @private
+     * @param {Model.InteractionNode} n Interaction node user clicked to
+     * @param {number} i index o the interaction node
+     * @param {*} g group of interaction nodes
+     * @returns
+     * @memberof Visualization
+     */
+    private selectLigand(n: Model.InteractionNode, i: number, g: any) {
+        this.fireExternalNodeEvent(n, Config.interactionClickEvent);
+
+        if (!n.residue.isLigand) return;
+
+        this.fireExternalNodeMouseLeaveEvent(n, i, g);
+        this.showLigandLabel(n);
+
+        this.initLigandInteractions(this.pdbId, n.residue.authorResidueNumber, n.residue.chainId);
+    }
+
+    /**
+     * Display error message on the SVG canvas if any of the resources
+     * are not available.
+     *
+     * @private
+     * @param {*} e error object
+     * @param {string} msg Error message to display
+     * @memberof Visualization
+     */
+    private processError(e: any, msg: string) {
+        this.canvas.append('text')
+            .classed('pdb-lig-env-svg-node', true)
+            .attr('x', this.parent.clientWidth / 3)
+            .attr('y', this.parent.clientHeight / 2)
+            .text(msg)
+
+        throw e;
+
+    }
+
+
+    /**
+     * Setup ligand scene for display of ligand and interactions.
+     * This includes: setup of links, nodes, simulation and subscribing to relevant events.
+     *
+     * Depiction is expected to be downloaded already.
+     *
+     * @private
+     * @memberof Visualization
+     */
+    private async setupLigandScene() {
+        this.wipeOutVisuals();
+        this.setupLinks();
+
+        this.bindingSite.interactionNodes
+            .filter((x: Model.InteractionNode) => !x.residue.isLigand)
+            .forEach((x: Model.InteractionNode) => {
+                let lnks = this.bindingSite.links
+                    .filter((y: Model.LigandResidueLink) => y.containsInteractionNode(x))
+                    .map((y: Model.LigandResidueLink) => [].concat.apply([], y.interaction.map(z => z.sourceAtoms)));
+
+                let concated = [].concat.apply([], lnks);
+                let position: Vector2D = this.depiction.getInitalNodePosition(concated);
+
+                x.x = position.x + Math.random() * 110;
+                x.y = position.y + Math.random() * 110;
+            });
+
+
+        // setup nodes; wait for resources to be ready
+        this.bindingSite.interactionNodes.forEach(x => this.rProvider.downloadAnnotation(x.residue));
+        await Promise.all(this.rProvider.downloadPromises);
+        await Promise.all([this.visualsMapper.graphicsPromise, this.visualsMapper.mappingPromise]);
+
+        this.nodes = this.nodesRoot.append('g')
+            .selectAll()
+            .data(this.bindingSite.interactionNodes)
+            .enter().append('g');
+
+
+        this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand)
+            .on('click', (x: Model.InteractionNode) => this.fireExternalNodeEvent(x, Config.interactionClickEvent))
+            .attr('class', (x: Model.InteractionNode) => `pdb-lig-env-svg-node pdb-lig-env-svg-${x.residue.getResidueType()}-res`)
+            .on('mouseenter', (x: Model.InteractionNode, i: number, g: any) => this.fireExternalNodeMouseEnterEvent(x, i, g))
+            .on('mouseleave', (x: Model.InteractionNode, i: number, g: any) => this.fireExternalNodeMouseLeaveEvent(x, i, g));
+
+        this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand && this.visualsMapper.glycanMapping.has(x.residue.chemCompId))
+            .html((e: Model.InteractionNode) => this.visualsMapper.getGlycanImage(e.residue.chemCompId));
+
+        // draw rest
+        this.nodes.filter((x: Model.InteractionNode) => !this.visualsMapper.glycanMapping.has(x.residue.chemCompId))
+            .append('circle')
+            .attr('r', (x: Model.InteractionNode) => x.scale * Config.nodeSize);
+
+        let nodesWithText = this.nodes.filter((x: Model.InteractionNode) => !x.residue.isLigand);
+        this.addNodeLabels(nodesWithText);
+
+        let forceLink = d3.forceLink()
+            .links(this.links.filter((x: Model.LigandResidueLink) => x.getLinkClass() !== 'hydrophobic'))
+            .distance(70)
+            .strength(0.5);
+
+        let charge = d3.forceManyBody().strength(-100).distanceMin(40).distanceMax(80);
+        let collision = d3.forceCollide().radius(45);
+
+        this.simulation = d3.forceSimulation(this.bindingSite.interactionNodes)
+            .force('link', forceLink)
+            .force('charge', charge) //strength 
+            .force('collision', collision)
+            .on('tick', () => this.simulationStep());
+
+        this.dragHandler(this.nodes);
+        if (this.zoomHandler !== undefined) this.zoomHandler(this.svg, d3.zoomIdentity);
+    }
+
+
+    /**
+     * Setup display of interactions for bound molecule. 
+     * * This includes: setup of links, nodes, simulation and subscribing to relevant events.
+     * No depiction is required for this step.
+     *
+     * @private
+     * @memberof Visualization
+     */
+    private async setupScene() {
+        this.wipeOutVisuals();
+        this.setupLinks();
+
+        // setup nodes; wait for resources to be ready
+        this.bindingSite.interactionNodes.forEach(x => ResidueProvider.getInstance().downloadAnnotation(x.residue));
+        await Promise.all(this.rProvider.downloadPromises);
+        await Promise.all([this.visualsMapper.graphicsPromise, this.visualsMapper.mappingPromise]);
+
+        this.nodes = this.nodesRoot
+            .selectAll()
+            .data(this.bindingSite.interactionNodes)
+            .enter().append('g')
+            .attr('class', (e: Model.InteractionNode) => `pdb-lig-env-svg-node pdb-lig-env-svg-${e.residue.getResidueType()}-res`)
+            .on('click', (x: Model.InteractionNode, i: number, g: any) => this.selectLigand(x, i, g))
+            .on('mouseover', (x: Model.InteractionNode, i: number, g: any) => this.fireExternalNodeMouseEnterEvent(x, i, g))
+            .on('mouseout', (x: Model.InteractionNode, i: number, g: any) => this.fireExternalNodeMouseLeaveEvent(x, i, g));
+
+
+        this.nodes.filter((n: Model.InteractionNode) =>
+            this.visualsMapper.glycanMapping.has(n.residue.chemCompId))
+            .html((e: Model.InteractionNode) => this.visualsMapper.getGlycanImage(e.residue.chemCompId));
+
+        this.nodes.filter((e: Model.InteractionNode) => !this.visualsMapper.glycanMapping.has(e.residue.chemCompId))
+            .append('circle')
+            .attr('r', Config.nodeSize);
+
+        this.addNodeLabels(this.nodes);
+
+        let forceLink = d3.forceLink()
+            .links(this.bindingSite.links)
+            .distance((x: Model.Link) => (<Model.InteractionNode>x.source).residue.isLigand && (<Model.InteractionNode>x.target).residue.isLigand ? 55 : 150)
+            .strength(0.5);
+
+        let charge = d3.forceManyBody().strength(-1000).distanceMin(55).distanceMax(250);
+        let collision = d3.forceCollide(45);
+        let center = d3.forceCenter(this.parent.offsetWidth / 2, this.parent.offsetHeight / 2);
+
+        this.simulation = d3.forceSimulation(this.bindingSite.interactionNodes)
+            .force('link', forceLink)
+            .force('charge', charge) //strength 
+            .force('collision', collision)
+            .force('center', center)
+            .on('tick', () => this.simulationStep());
+
+        this.dragHandler(this.nodes);
+
+        if (this.zoomHandler) this.zoomHandler(this.svg);
+    }
+
+
+    /**
+     * This is a tick in a simulation that updates position of nodes and links
+     * Depiction does not change its conformation.
+     *
+     * @private
+     * @memberof Visualization
+     */
+    private simulationStep() {
+        this.nodes.attr('transform', (n: Model.InteractionNode) => `translate(${n.x},${n.y}) scale(${n.scale})`);
+        this.links.selectAll('line').attr('x1', (x: any) => x.source.x)
+            .attr('y1', (x: any) => x.source.y)
+            .attr('x2', (x: any) => x.target.x)
+            .attr('y2', (x: any) => x.target.y);
+    }
+
+
+    private nodeHighlight(x: Model.InteractionNode, i: number, g: any) {
+        x.scale = 1.5;
+
+        if (x.residue.isLigand) d3.select(g[i]).style('cursor', 'pointer');
+        d3.select(g[i])
+            .attr('transform', () => `translate(${x.x},${x.y}) scale(${x.scale})`);
+    }
+
+
+    private nodeDim(x: Model.InteractionNode, i: number, g: any) {
+        x.scale = 1.0;
+
+        if (x.residue.isLigand) d3.select(g[i]).style('cursor', 'default');
+
+        d3.select(g[i])
+            .attr('transform', `translate(${x.x},${x.y}) scale(${x.scale})`);
+    }
+
+
+    private showLigandLabel(x: Model.InteractionNode) {
+        const e = new CustomEvent(Config.interactionShowLabelEvent, {
+            bubbles: true,
+            detail: {
+                label: x.toTooltip()
+            }
+        });
+
+        this.parent.dispatchEvent(e);
+    }
+
+
+    private hideLigandLabel() {
+        const e = new CustomEvent(Config.interactionHideLabelEvent, {
+            bubbles: true,
+            detail: {}
+        });
+
+        this.parent.dispatchEvent(e);
+    }
+
+
+    private addMarkers() {
+        // let mapping = new Map<string, string>([
+        //     // ["arrow-electrostatic", "#3F26BF"],
+        //     // ["arrow-vdw", "#9B7653"],
+        //     // ["arrow-metal", "#008080"],
+        //     // ["arrow-aromatic", "#AD4379"],
+        // ]);
+
+        this.svg
+            .append('defs')
+            .append('marker')
+            .attr('id', 'clash')
+            .attr("markerWidth", 15)
+            .attr("markerHeight", 15)
+            .attr("refX", 7)
+            .attr("refY", 3)
+            .attr("orient", "auto")
+            .attr('markerUnits', 'strokeWidth')
+
+            .append('path')
+            .attr('d', 'M22.245,4.015c0.313,0.313,0.313,0.826,0,1.139l-6.276,6.27c-0.313,0.312-0.313,0.826,0,1.14l6.273,6.272  c0.313,0.313,0.313,0.826,0,1.14l-2.285,2.277c-0.314,0.312-0.828,0.312-1.142,0l-6.271-6.271c-0.313-0.313-0.828-0.313-1.141,0  l-6.276,6.267c-0.313,0.313-0.828,0.313-1.141,0l-2.282-2.28c-0.313-0.313-0.313-0.826,0-1.14l6.278-6.269  c0.313-0.312,0.313-0.826,0-1.14L1.709,5.147c-0.314-0.313-0.314-0.827,0-1.14l2.284-2.278C4.308,1.417,4.821,1.417,5.135,1.73  L11.405,8c0.314,0.314,0.828,0.314,1.141,0.001l6.276-6.267c0.312-0.312,0.826-0.312,1.141,0L22.245,4.015z')
+            .attr('style', 'stroke:#FF5050;stroke-width:3px;');
+
+        // mapping.forEach((x, y) =>
+        //     d3.select('defs').append('marker')
+        //         .attr('id', y)
+        //         .attr("markerWidth", 15)
+        //         .attr("markerHeight", 15)
+        //         .attr("refX", 7)
+        //         .attr("refY", 3)
+        //         .attr("orient", "auto")
+        //         .attr('markerUnits', 'strokeWidth')
+        //         .attr('viewBox', '0 0 20 20')
+        //         .append('path')
+        //         .attr('d', 'M0,0 L0,6 L9,3 z')
+        //         .attr('fill', x)
+        // );    
+    }
+}
+
diff --git a/src/model.ts b/src/plugin/model.ts
similarity index 67%
rename from src/model.ts
rename to src/plugin/model.ts
index 8384393ed84e85aad554864aca642b5da3bdc288..c0dfe6358e34a5c5677479e89bb9a94e5c05100b 100644
--- a/src/model.ts
+++ b/src/plugin/model.ts
@@ -1,49 +1,6 @@
 namespace Model {
     "use strict";
 
-    const aminoAcids = new Map<string, Array<string>>([
-        ['cystein', new Array<string>('CYS', 'SEC', 'CSO')],
-        ['positive', new Array<string>('LYS', 'ARG')],
-        ['negative', new Array<string>('ASP', 'GLU')],
-        ['polar', new Array<string>('SER', 'SEP', 'THR', 'ASN', 'GLN', 'TPO')],
-        ['aliphatic', new Array<string>('ALA', 'VAL', 'ILE', 'LEU', 'MET', 'PRO', 'MSE')],
-        ['aromatic', new Array<string>('TRP', 'TYR', 'PHE', 'HIS')]
-    ]);
-
-    const backboneAtoms = ['N', 'CA', 'C', 'O'];
-
-    const interactionsClasses = new Map<string, Array<string>>([
-        ["covalent", new Array<string>("covalent")],
-        ["electrostatic", new Array<string>("ionic", "hbond", "weak_hbond", "polar", "weak_polar", "xbond", "carbonyl")],
-        ['amide', new Array<string>("AMIDEAMIDE", "AMIDERING")],
-        ["vdw", new Array<string>("vdw")],
-        ["hydrophobic", new Array<string>("hydrophobic")],
-        ["aromatic", new Array<string>("aromatic", "FF", "OF", "EE", "FT", "OT", "ET", "FE", "OE", "EF", "CARBONPI", "CATIONPI", "DONORPI", "HALOGENPI", "METSULPHURPI")],
-        ["metal", new Array<string>("metal_complex")],
-        ["clashes", new Array<string>("clash", "vdw_clash")]
-    ]);
-
-    export class UIParameters {
-        reinitialize: boolean;
-        downloadImage: boolean;
-        downloadData: boolean;
-        center: boolean;
-        help: boolean;
-        residueLabel: boolean;
-        tooltip: boolean;
-
-        constructor() {
-            this.reinitialize = true;
-            this.downloadImage = true;
-            this.downloadData = true;
-            this.center = true;
-            this.help = true;
-            this.residueLabel = true;
-            this.tooltip = true;
-
-        }
-    }
-
     /**
      *
      *
@@ -104,7 +61,7 @@ namespace Model {
             this.chemCompId = data.chem_comp_id;
             this.authorInsertionCode = data.author_insertion_code;
             this.id = `${this.chainId}${this.authorResidueNumber}${(this.authorInsertionCode === ' ' ? '' : this.authorInsertionCode)}`;
-            this.isLigand = isLigand
+            this.isLigand = isLigand;
         }
 
         /**
@@ -120,13 +77,15 @@ namespace Model {
                 return 'water';
             }
 
-            for (let [key, value] of aminoAcids) {
-                if (value.includes(this.chemCompId)) {
+            let code = ResidueProvider.getInstance().getAminoAcidAbbreviation(this.chemCompId);
+
+            for (let [key, value] of Config.aaTypes) {
+                if (value.includes(code)) {
                     return key;
                 }
             }
 
-            return 'others';
+            return 'other';
         }
 
         public equals(other: Residue): boolean {
@@ -143,7 +102,8 @@ namespace Model {
     export class InteractionNode implements d3.SimulationNodeDatum {
         id: string;
         residue: Residue;
-        scale: number;
+        scale: number; // how is the node scaled up in comparison to its original size
+        static: boolean // whether or not can be dragged and droped
 
         index?: number;
         x?: number;
@@ -156,6 +116,7 @@ namespace Model {
         constructor(r: Residue, scale: number, id: string, x: number = undefined, y: number = undefined) {
             this.residue = r;
             this.id = id;
+            this.static = Boolean(scale < 1.0);
             this.scale = scale;
 
             if (x !== undefined) {
@@ -188,6 +149,7 @@ namespace Model {
         target: InteractionNode;
 
         getLinkClass(): string;
+        hasClash(): boolean;
         toTooltip(): string;
     }
 
@@ -215,6 +177,17 @@ namespace Model {
             return this.target.equals(n) || this.source.equals(n);
         }
 
+        public hasClash(): boolean {
+            this.interactions.forEach(x => {
+                if (x.includes('clash')) {
+                    return true
+                }
+            });
+            return false;
+        }
+
+
+
         /**
          * Shorthand to check if the link contains particular underlying
          * residue.
@@ -247,7 +220,7 @@ namespace Model {
             if (this.isBoundMoleculeLink()) return 'ligand';
 
             // JS map preserves order of elements
-            for (let [key, value] of interactionsClasses) {
+            for (let [key, value] of Config.interactionsClasses) {
                 for (let interactionDetails of this.interactions.values()) {
                     if (interactionDetails.filter(x => -1 !== value.indexOf(x)).length > 0) {
                         return key;
@@ -299,7 +272,7 @@ namespace Model {
             // JS map preserves order of elements
             let allInteractions = this.interaction.map(x => x.interactionsClases).reduce((x, y) => x.concat(y));
 
-            for (let [key, value] of interactionsClasses) {
+            for (let [key, value] of Config.interactionsClasses) {
                 if (allInteractions.filter(x => -1 !== value.indexOf(x)).length > 0) {
                     return key;
                 }
@@ -324,15 +297,23 @@ namespace Model {
         }
 
         public toTooltip() {
-            let msg = [];
+            let msg = new Set();
+            let rProvider = ResidueProvider.getInstance();
+
             this.interaction.forEach(x => {
-                let isMainChain = !this.target.residue.isLigand && x.targetAtoms.every(y => backboneAtoms.includes(y));
-                let interactionFlag = isMainChain ? 'backbone' : 'side chain';
+                let isMainChain = !this.target.residue.isLigand && x.targetAtoms.every(y => Config.backboneAtoms.includes(y));
+                let targetAbbreviation = rProvider.getAminoAcidAbbreviation(this.target.residue.chemCompId);
+                let isResidue = Boolean(targetAbbreviation !== 'X');
+                let interactionFlag = '';
+
+                if (isMainChain && isResidue) interactionFlag = 'backbone';
+                else if (!isMainChain && isResidue) interactionFlag = 'side chain';
+                else interactionFlag = 'ligand';
 
-                msg.push(`<li><span>${interactionFlag}</span> interaction (<b>${x.targetAtoms}</b> | ${x.interactionsClases}): ${x.distance}Ã…</li>`);
+                msg.add(`<li><span>${interactionFlag}</span> interaction (<b>${x.targetAtoms}</b> | ${x.interactionsClases}): ${x.distance}Ã…</li>`);
             });
 
-            return `<ul>${msg.join('\n')}</ul>`;
+            return `<ul>${Array.from(msg.values()).join('\n')}</ul>`;
         }
 
     }
@@ -350,6 +331,8 @@ namespace Model {
         interactionNodes: InteractionNode[];
         links: Link[];
 
+        private tmpResidueSet: ObjectSet<Residue>;
+        private tmpNodesSet: ObjectSet<InteractionNode>;
 
         constructor() {
             this.residues = new Array<Residue>();
@@ -362,36 +345,30 @@ namespace Model {
             this.pdbId = pdbId;
             this.bmId = data.bm_id;
 
-            data.composition.ligands.forEach(x => this.residues.push(new Residue(x, true)));
+            this.tmpResidueSet = new ObjectSet<Residue>();
+            this.tmpNodesSet = new ObjectSet<InteractionNode>();
+
+            data.composition.ligands.forEach(x => this.tmpResidueSet.tryAdd(new Residue(x, true)));
             data.interactions.forEach(x => {
-                let beginingNode = this.processResidueInteractionPartner(x.begin);
+                let bgnNode = this.processResidueInteractionPartner(x.begin);
                 let endNode = this.processResidueInteractionPartner(x.end);
-                let link = new ResidueResidueLink(beginingNode, endNode, x.interactions)
+
+                let link = new ResidueResidueLink(bgnNode, endNode, x.interactions)
 
                 this.links.push(link);
             });
 
+            this.interactionNodes = Array.from(this.tmpNodesSet.values());
+
             return this;
         }
 
 
         private processResidueInteractionPartner(r: any): InteractionNode {
-            let residue = this.residues.find(x => {
-                let hash = `${r.chain_id}${r.author_residue_number}${(r.author_insertion_code === ' ' ? '' : r.author_insertion_code)}`;;
-                return hash === x.id;
-            });
-
-            if (residue === undefined) {
-                residue = new Residue(r, false);
-                this.residues.push(residue);
-            }
-
-            let node = this.interactionNodes.find(x => x.id === residue.id);
-            if (node === undefined) {
-                let node = new InteractionNode(residue, 1.0, residue.id);
-                this.interactionNodes.push(node);
-                return node;
-            }
+            let residue = new Residue(r, false);
+            residue = this.tmpResidueSet.tryAdd(residue);
+            let node = new InteractionNode(residue, 1.0, residue.id);
+            node = this.tmpNodesSet.tryAdd(node);
 
             return node;
         }
@@ -403,15 +380,12 @@ namespace Model {
             else scale = 1.0
 
             let center = d.getCenter(atom_names);
-            let id = `${r.id}_${atom_names.reduce((x, y) => x + "_" + y)}`;
-            let nodeProvider = this.interactionNodes.find(x => x.id === id);
+            let id = `${r.id}_${atom_names.sort().reduce((x, y) => x + "_" + y)}`;
 
-            if (nodeProvider === undefined) {
-                let tmpNode = new InteractionNode(r, scale, id, center.x, center.y);
-                this.interactionNodes.push(tmpNode);
-                return tmpNode;
-            }
-            return nodeProvider;
+            let node = new InteractionNode(r, scale, id, center.x, center.y);
+            node = this.tmpNodesSet.tryAdd(node);
+
+            return node;
         }
 
 
@@ -419,23 +393,77 @@ namespace Model {
             this.pdbId = pdbId;
             this.bmId = `${data.ligand.chem_comp_id}_${data.ligand.chain_id}_${data.ligand.author_residue_number}`;
 
+            this.tmpResidueSet = new ObjectSet<Residue>();
+            this.tmpNodesSet = new ObjectSet<InteractionNode>();
+            let tmpLinks = new Array<LigandResidueLink>();
+
             let ligandResidue = new Residue(data.ligand, true);
-            this.residues.push(ligandResidue);
+            this.tmpResidueSet.tryAdd(ligandResidue);
+
+            ligand.atoms.forEach(x => this.processLigandInteractionPartner(ligandResidue, ligand, [x.name]));
 
             data.interactions.forEach(x => {
-                let beginingNode = this.processLigandInteractionPartner(ligandResidue, ligand, x.ligand_atoms);
+                let bgnNode = this.processLigandInteractionPartner(ligandResidue, ligand, x.ligand_atoms);
                 let endNode = this.processResidueInteractionPartner(x.end);
-                let tmpLink = this.links.find(x => (<LigandResidueLink>x).containsBothNodes(beginingNode, endNode)) as LigandResidueLink;
+
+                if (bgnNode.residue.equals(endNode.residue)) {
+                    this.tmpNodesSet.delete(endNode);
+                    return; // we do not want to show 'self interactions'  
+                }
+
+                let tmpLink = tmpLinks.find(x => (<LigandResidueLink>x).containsBothNodes(bgnNode, endNode)) as LigandResidueLink;
 
                 if (tmpLink !== undefined) {
                     tmpLink.addInteraction(x.ligand_atoms, x.end.atom_names, x.interaction_type, x.interaction_details, x.distance);
                 } else {
-                    let link = new LigandResidueLink(beginingNode, endNode, x.ligand_atoms, x.end.atom_names, x.interaction_type, x.interaction_details, x.distance);
-                    this.links.push(link);
+                    let link = new LigandResidueLink(bgnNode, endNode, x.ligand_atoms, x.end.atom_names, x.interaction_type, x.interaction_details, x.distance);
+                    tmpLinks.push(link);
                 }
             });
+
+            this.interactionNodes = Array.from(this.tmpNodesSet);
+            this.links = this.filterOutAromaticAtomAtomInteractions(tmpLinks);
+
             return this;
         }
+
+        /**
+         * Filter out Aromatic atom atom interactions provided there is
+         * an evidence of the same atom being part of the stacking information
+         * 
+         * This is for clarity purposes only.
+         *
+         * @private
+         * @param {Array<LigandResidueLink>} src
+         * @returns {Array<LigandResidueLink>}
+         * @memberof BindingSite
+         */
+        private filterOutAromaticAtomAtomInteractions(src: Array<LigandResidueLink>): Array<LigandResidueLink> {
+            let result = new Array<LigandResidueLink>();
+            src.forEach((x: LigandResidueLink) => {
+                let isAtomAtom = x.interaction.map(y => y.interactionType).every(z => z === InteractionType.AtomAtom);
+
+                if (x.getLinkClass() === 'aromatic' && isAtomAtom) {
+                    let targetAtoms = x.interaction.map(y => y.targetAtoms).reduce((a, b) => a.concat(b));
+                    let otherInteractions = new Set(src.filter(y => y.target.equals(x.target)));
+                    otherInteractions.delete(x);
+
+                    let otherBoundAtoms = Array.from(otherInteractions)
+                        .map(y => y.interaction)
+                        .reduce((a, b) => a.concat(b))
+                        .map(y => y.targetAtoms)
+                        .reduce((a, b) => a.concat(b));
+
+                    if (otherBoundAtoms.includes(targetAtoms[0])) {
+                        return;
+                    }
+                }
+
+                result.push(x);
+            });
+
+            return result;
+        }
     }
 
 }
\ No newline at end of file
diff --git a/src/plugin/objectSet.ts b/src/plugin/objectSet.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5ff62f3bc7d3f69984fd9993c4e599371a5afbca
--- /dev/null
+++ b/src/plugin/objectSet.ts
@@ -0,0 +1,30 @@
+/**
+ * Extension class just to get objects and collections work nicely.
+ * Not sure what the javascript way is if you need distinct on 
+ *
+ * @export
+ * @class ObjectSet
+ * @extends {Set<T>}
+ * @template T
+ */
+class ObjectSet<T> extends Set<T> { 
+    
+    public tryAdd(value: T): T {
+        let item = undefined;
+
+        this.forEach((x: any) => {
+            if (x.equals(value)) {
+                item = x;
+                return;
+            }
+        });
+
+        if (item === undefined) { 
+            item = value;
+            super.add(value);
+        }
+
+        return item;
+    }
+
+}
\ No newline at end of file
diff --git a/src/plugin/residuefactory.ts b/src/plugin/residuefactory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb232afc82807d7e5bb55a085f21fb5ec81647b3
--- /dev/null
+++ b/src/plugin/residuefactory.ts
@@ -0,0 +1,74 @@
+/**
+ * Singleton instance to provide residue abbreviations to the component
+ *
+ * @class ResidueProvider
+ */
+class ResidueProvider {
+    private static instance: ResidueProvider;
+    private mapping: Map<string, string>;
+    public downloadPromises: Array<Promise<any>>;
+
+
+    /**
+     * The Singleton's constructor should always be private to prevent direct
+     * construction calls with the `new` operator.
+     * @memberof ResidueProvider
+     */
+    private constructor() {
+        this.mapping = new Map<string, string>(Config.aaAbreviations);
+        this.downloadPromises = new Array<Promise<any>>();
+    }
+
+
+    /**
+     * The static method that controls the access to the singleton instance.
+     *
+     * This implementation let you subclass the Singleton class while keeping
+     * just one instance of each subclass around.
+     *
+     * @static
+     * @returns {ResidueProvider}
+     * @memberof ResidueProvider
+     */
+    public static getInstance(): ResidueProvider {
+        if (!ResidueProvider.instance) {
+            ResidueProvider.instance = new ResidueProvider();
+        }
+
+        return ResidueProvider.instance;
+    }
+
+
+    /**
+     * Get single letter abbreviation of the ligand.
+     *
+     * @param {string} name Name of the chemical compound
+     * @returns Single letter abbreviation of the ligand
+     * @memberof ResidueProvider
+     */
+    public getAminoAcidAbbreviation(name: string): string {
+        return this.mapping.has(name) ? this.mapping.get(name) : undefined;
+    }
+
+
+    /**
+     * Fetch single letter abbreviations from API if they are not present
+     *
+     * @param {string} n
+     * @returns
+     * @memberof ResidueProvider
+     */
+    public downloadAnnotation(r: Model.Residue): void {
+        if (this.mapping.has(r.chemCompId) || r.isLigand) return;
+
+        let url = Resources.residueTypeAPI(r.chemCompId);
+        let res = d3.json(url).then(x => {
+            let code = x[r.chemCompId][0].one_letter_code;
+            this.mapping.set(r.chemCompId, code);
+
+            return code;
+        });
+
+        this.downloadPromises.push(res);
+    }
+}
\ No newline at end of file
diff --git a/src/plugin/resources.ts b/src/plugin/resources.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7c3148e38047dd70146a1abd05fff139e2280ed0
--- /dev/null
+++ b/src/plugin/resources.ts
@@ -0,0 +1,24 @@
+namespace Resources { 
+    export const apiServer: string = 'https://wwwdev.ebi.ac.uk/pdbe/graph-api';
+    export const glycanSymbols: string = 'https://pdbe.gitdocs.ebi.ac.uk/web-components/ligand-env/pdb-snfg-visuals.xml';
+    export const glycanMapping: string = 'https://pdbe.gitdocs.ebi.ac.uk/web-components/ligand-env/het_mapping.json';
+    export const componentSvgCss: string = 'https://pdbe.gitdocs.ebi.ac.uk/web-components/ligand-env/pdb-ligand-env-svg.css';
+
+    export const residueTypeURL: string = "https://www.ebi.ac.uk/pdbe/api/pdb/compound/summary/";
+
+    export function ligandAnnotationAPI(ligandName: string): string { 
+        return `https://www.ebi.ac.uk/pdbe/static/files/pdbechem_v2/${ligandName}/annotation`;
+    }
+
+    export function boundMoleculeAPI(pdbId: string, bmId: string): string { 
+        return `${apiServer}/pdb/bound_molecule_interactions/${pdbId}/${bmId}`;
+    }
+
+    export function ligandInteractionsAPI(pdbId: string, chainId: string, resId: number) { 
+        return `${apiServer}/pdb/bound_ligand_interactions/${pdbId}/${chainId}/${resId}`;
+    }
+
+    export function residueTypeAPI(chemCompId: string): string { 
+        return `${residueTypeURL}${chemCompId}`;
+    }
+}
\ No newline at end of file
diff --git a/src/plugin/ui.ts b/src/plugin/ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..07518726a44a3f5f6eb336af973af340615ffafe
--- /dev/null
+++ b/src/plugin/ui.ts
@@ -0,0 +1,410 @@
+// #region help
+let helpLigands = `
+    <table class='pdb-lig-env-help-table'>
+        <tr>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #80A0F0; "></div>
+            </td>
+            <td>hydrophobic</td>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #C048C0;"></div>
+            </td>
+            <td>negativelly charged</td>
+        </tr>
+        <tr>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #15A4A4;"></div>
+            </td>
+            <td>aromatic</td>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #15C015;"></div>
+            </td>
+            <td>polar</td>
+            <td>
+        </tr>
+        <tr>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #F08080;"></div>
+            </td>
+            <td>cystein</td>         
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #00BFFF;"></div>
+            </td>
+            <td>water</td>                    
+        </tr>
+        <tr>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #F01505;"></div>
+            </td>
+            <td>positivelly charged</td>
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: #F2F2F2;"></div>
+            </td>
+            <td>other</td>               
+        </tr>
+        <tr>
+            <td>
+                 <div class="pdb-lig-env-help-residue" style="background: #F09048;"></div>
+            </td>
+            <td>glycine</td>                            
+            <td>
+                <div class="pdb-lig-env-help-residue" style="background: white; border: 1.2px solid black;"></div>
+            </td>
+            <td>bound molecule</td>
+        </tr>
+        <tr>
+        <td></td>
+        <td><a href="https://www.ncbi.nlm.nih.gov/glycans/snfg.html" target="blank">glycans (SNFG)</a></td>
+        <td></td>
+        <td></td>
+        </tr>
+    </table>
+    `
+let helpBonds = `
+<table class='pdb-lig-env-help-table' style="border-bottom: 0.5px solid black; padding-bottom: 10px;">
+<tr>
+    <td>
+        <hr style="border: 0 none; border-top: 5px solid #AD4379; background: none; height: 0;" />
+    </td>
+    <td>aromatic</td>
+    <td>
+            <hr style="border: 0 none; border-top: 5px solid #FF5050; background: none; height: 0;" />
+    </td>
+    <td>clashes</td>
+</tr>
+<tr>
+    <td>
+            <hr style="border: 0 none; border-top: 5px solid black; background: none; height: 0;" />
+    </td>
+    <td>covalent</td>
+    <td>
+            <hr style="border: 0 none; border-top: 5px solid #3F26BF; background: none; height: 0;" />
+    </td>
+    <td>electrostatic</td>
+
+</tr>
+<tr>
+    <td>
+        <hr style="border: 0 none; border-top: 5px solid #008080; background: none; height: 0;" />                        
+    </td>
+    <td>metal</td>
+    <td></td>
+    <td>hydrophobic</td>
+</tr>
+
+<tr>
+    <td>
+        <hr style="border: 0 none; border-top: 5px solid #9B7653; background: none; height: 0;" />
+    </td>
+    <td>vdw</td>
+</tr>
+</table>
+<table class="pdb-lig-env-help-table" style="margin-top: 5px;">
+<tr>
+    <td>
+        <hr style="border: 0 none; border-top: 5px solid black; background: none; height: 0;" />
+    </td>
+    <td>covalent</td>
+    <td>
+        <hr style="border: 0 none; border-top: 5px dashed black; background: none; height: 0;" />
+    </td>
+    <td>non-covalent</td>
+</tr>                
+</table>`
+
+// #endregion help
+
+
+
+class UI {
+    private parent: HTMLElement;
+    private display: Visualization;
+
+    private residueLabel: d3.Selection<d3.BaseType, {}, HTMLElement, any>; //label used to display ligand ids
+    private tooltip: d3.Selection<d3.BaseType, {}, HTMLElement, any>; // mouseover tooltips
+
+    private originalWidth: number;
+    private originalHeight: number;
+
+
+    constructor(element: HTMLElement, vis: Visualization) {
+        this.parent = element;
+        this.display = vis;
+
+        this.originalWidth = this.parent.offsetWidth;
+        this.originalHeight = this.parent.offsetHeight;
+
+
+    }
+
+    /**
+     * Registers UI elements on the top of SVG canvas with interactions
+     * and ligands
+     *
+     * @param {Config.UIParameters} params Object with annotation which
+     * UI elements should be created.
+     * @returns
+     * @memberof UI
+     */
+    public register(params: Config.UIParameters) {
+        if (!Object.keys(params).some(x => params[x])) {
+            return;
+        }
+
+        let toolbar = d3.select(this.parent)
+            .append('div')
+            .classed('pdb-lig-env-toolbar-container', true)
+            .on('mouseover', () => this.displayToolbarPanel(true))
+            .on('mouseout', () => this.displayToolbarPanel(false));
+
+        toolbar.append('div')
+            .classed('pdb-lig-env-menu-panel', true)
+            .append('i')
+            .attr('title', 'Menu')
+            .attr('class', 'icon icon-common icon-bars');
+
+        let dynamicPanel = toolbar.append('div')
+            .classed('pdb-lig-env-menu-panel', true)
+            .attr('id', 'pdb-lig-env-menu-dynamic-panel')
+            .style('display', 'none')
+            .style('opacity', 0);
+
+        if (params.help) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-help-btn')
+                .attr('title', 'Help')
+                .attr('class', 'icon icon-common icon-question-circle')
+                .on('click', () => this.showHelp());
+
+            let cont = d3.select(this.parent).append('div').attr('id', 'pdb-lig-env-help-container')
+            let navbar = cont.append('div').classed('pdb-lig-env-help-navbar', true);
+
+            navbar.append('a')
+                .classed('active', true)
+                .attr('id', 'pdb-lig-env-help-residues-btn')
+                .text('Ligands and residues')
+                .on('click', () => this.changeHelp(true));
+
+            navbar.append('a')
+                .attr('id', 'pdb-lig-env-help-bonds-btn')
+                .text('Interactions')
+                .on('click', () => this.changeHelp(false));
+
+            cont.append('div').attr('id', 'pdb-lig-env-help-ligands').html(helpLigands);
+            cont.append('div').attr('id', 'pdb-lig-env-help-bonds').html(helpBonds);
+        }
+
+        if (params.downloadImage) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-screenshot-btn')
+                .attr('title', 'Screenshot')
+                .attr('class', 'icon icon-common icon-camera')
+                .on('click', () => this.saveSVG());
+        }
+
+        if (params.downloadData) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-download-btn')
+                .attr('title', 'Download interactions')
+                .attr('class', 'icon icon-common icon-download')
+                .on('click', () => this.download());
+        }
+
+
+
+
+        if (params.center) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-center-btn')
+                .attr('title', 'Center screen')
+                .attr('class', 'icon icon-common icon-crosshairs')
+                .on('click', () => this.center());
+        }
+
+        if (params.fullScreen) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-fullscreen-btn')
+                .attr('title', 'Toggle Expanded')
+                .attr('class', 'icon icon-common icon-fullscreen')
+                .on('click', () => this.fullScreen());
+        }
+
+        if (params.reinitialize) {
+            dynamicPanel.append('i')
+                .attr('id', 'pdb-lig-env-home-btn')
+                .attr('title', 'Reset Camera')
+                .attr('class', 'icon icon-common icon-sync-alt')
+                .on('click', () => this.reinitialize());
+        }
+
+        if (params.tooltip) {
+            this.tooltip = d3.select(this.parent).append('div')
+                .classed('pdb-lig-env-label', true)
+                .attr('id', 'pdb-lig-env-tooltip')
+                .style('opacity', 0)
+        }
+
+        if (params.residueLabel) {
+            this.residueLabel = d3.select(this.parent).append('div')
+                .classed('pdb-lig-env-label', true)
+                .attr('id', 'pdb-lig-env-residue-label')
+                .style('opacity', 0)
+        }
+
+        if (this.tooltip !== undefined) {
+            this.parent.addEventListener(Config.interactionClickEvent, e => this.nodeMouseEnterEventHandler(e));
+            this.parent.addEventListener(Config.interactionMouseoverEvent, e => this.nodeMouseEnterEventHandler(e));
+            this.parent.addEventListener(Config.interactionMouseoutEvent, () => this.nodeMouseLeaveEventHandler());
+        }
+
+        if (this.residueLabel !== undefined) {
+            this.parent.addEventListener(Config.interactionShowLabelEvent, e => this.showLigandLabel(e));
+            this.parent.addEventListener(Config.interactionHideLabelEvent, () => this.hideLigandLabel());
+        }
+
+    }
+
+    // #region UI methods
+    private saveSVG() {
+        this.display.saveSvg();
+    }
+
+    private reinitialize() {
+        this.display.reinitialize()
+    }
+
+    private download() {
+        this.display.downloadInteractionsData()
+    }
+
+    private center() {
+        this.display.centerScene()
+    }
+
+    private changeHelp(showResidues: boolean) {
+        let ligHelpBtn = d3.select(this.parent).select('#pdb-lig-env-help-residues-btn');
+        let bondHelpBtn = d3.select(this.parent).select('#pdb-lig-env-help-bonds-btn');
+        let bondHelpSection = d3.select(this.parent).select('#pdb-lig-env-help-bonds');
+        let ligHelpSection = d3.select(this.parent).select('#pdb-lig-env-help-ligands');
+
+        if (showResidues) {
+            bondHelpBtn.classed('active', false);
+            ligHelpBtn.classed('active', true);
+            bondHelpSection.style('display', 'none');
+            ligHelpSection.style('display', 'block');
+
+        } else {
+            ligHelpBtn.classed('active', false);
+            bondHelpBtn.classed('active', true);
+            bondHelpSection.style('display', 'block');
+            ligHelpSection.style('display', 'none');
+        }
+    }
+
+    private showHelp() {
+        let el = d3.select(this.parent).select('#pdb-lig-env-help-container');
+        let btn = d3.select(this.parent).select('#pdb-lig-env-help-btn');
+
+        if (el.style('display') === 'block') {
+            el.style('display', 'none');
+            el.style('opacity', 0);
+            btn.style('color', '');
+        } else {
+            el.style('display', 'block');
+            el.style('opacity', 1);
+            btn.style('color', '#637ca0');
+        }
+    }
+
+    private displayToolbarPanel(show: boolean) {
+        let dynPanel = d3.select(this.parent).select('#pdb-lig-env-menu-dynamic-panel');
+        let el = d3.select(this.parent).select('#pdb-lig-env-help-container');
+
+        if (!dynPanel && !el) return;
+
+        if (show || el.style('display') === 'block') {
+            dynPanel.style('display', 'block');
+            dynPanel.style('opacity', 0.9);
+        } else {
+
+            dynPanel.style('display', 'none');
+            dynPanel.style('opacity', 0);
+        }
+    }
+
+    /**
+     * Switch component view and full screen.
+     *
+     * @private
+     * @memberof UI
+     */
+    private fullScreen() {
+        let btn = d3.select(this.parent).select('#pdb-lig-env-fullscreen-btn');
+
+        if (btn.attr('class') === 'icon icon-common icon-fullscreen') {
+            this.display.fullScreen = true;
+
+            this.parent.parentElement.style.width = '100%'
+            this.parent.parentElement.style.height = '100%'
+            this.parent.parentElement.style.position = 'fixed';
+            this.parent.parentElement.style.top = '0';
+            this.parent.parentElement.style.left = '0';
+            this.parent.parentElement.style.zIndex = '10000000000000';
+
+            btn.classed('icon-fullscreen', false);
+            btn.classed('icon-fullscreen-collapse', true);
+
+            this.display.centerScene();
+        } else {
+            this.display.fullScreen = true;
+
+            this.parent.parentElement.style.width = `${this.originalWidth}px`;
+            this.parent.parentElement.style.height = `${this.originalHeight}px`;
+            this.parent.parentElement.style.position = 'relative';
+            this.parent.parentElement.style.zIndex = '';
+
+            btn.classed('icon-fullscreen', true);
+            btn.classed('icon-fullscreen-collapse', false);
+
+            this.display.centerScene();
+
+
+        }
+    }
+    // #endregion UI methods
+
+    // #region event handlers
+    private nodeMouseEnterEventHandler(e: any) {
+
+        this.tooltip.transition()
+            .duration(200)
+            .style('opacity', .9);
+
+        this.tooltip.html(e.detail.tooltip);
+
+    }
+
+    private nodeMouseLeaveEventHandler() {
+        this.tooltip.transition()
+            .duration(200)
+            .style('opacity', 0);
+
+    }
+
+    private showLigandLabel(e: any) {
+        this.residueLabel.transition()
+            .duration(200)
+            .style('opacity', .9);
+
+        this.residueLabel.html(e.detail.label);
+
+    }
+
+    private hideLigandLabel() {
+        this.residueLabel.transition()
+            .duration(200)
+            .style('opacity', 0);
+    }
+    // #endregion event handlers
+
+}
\ No newline at end of file
diff --git a/src/visualsMapping.ts b/src/plugin/visualsMapping.ts
similarity index 88%
rename from src/visualsMapping.ts
rename to src/plugin/visualsMapping.ts
index 79db6dd9e43bd01d4e69531388944fcc294157cd..de34c5cd237673941e11abcaf7f769d2e8ff453e 100644
--- a/src/visualsMapping.ts
+++ b/src/plugin/visualsMapping.ts
@@ -18,8 +18,8 @@ class VisualsMapper {
         this.glycanMapping = new Map<string, string>();
         this.glycanImages = new Map<string, SVGElement>();
 
-        this.graphicsPromise = this.parseSymbols('https://pdbe.gitdocs.ebi.ac.uk/web-components/interactions/visuals.xml');
-        this.mappingPromise = this.parseGlycanMapping('https://pdbe.gitdocs.ebi.ac.uk/web-components/interactions/het_mapping.json');        
+        this.graphicsPromise = this.parseSymbols(Resources.glycanSymbols);
+        this.mappingPromise = this.parseGlycanMapping(Resources.glycanMapping);        
     }
     
     /**
diff --git a/src/styles/pdb-ligand-env-svg.css b/src/styles/pdb-ligand-env-svg.css
new file mode 100644
index 0000000000000000000000000000000000000000..df14ba1bbac29549efbf7b70816fb52e7a39c85c
--- /dev/null
+++ b/src/styles/pdb-ligand-env-svg.css
@@ -0,0 +1,158 @@
+.pdb-lig-env-svg-shadow-node {
+    stroke-width: 0;
+    fill: white;
+}
+
+.pdb-lig-env-svg-shadow-bond {
+    stroke-width: 15px;
+    stroke: transparent;
+}
+
+.pdb-lig-env-svg-bond {
+    fill: none;
+    fill-rule: evenodd;
+    stroke-linecap: butt;
+    stroke-linejoin: miter;
+    stroke-opacity: 1;
+}
+
+.pdb-lig-env-svg-bond-ligand {
+    stroke-width: 4px;
+    stroke: black;
+}
+
+.pdb-lig-env-svg-bond-electrostatic {
+    stroke-width: 2px;
+    stroke-dasharray: 10 10;
+    stroke: #3F26BF;
+}
+
+.pdb-lig-env-svg-bond-stacking {
+    stroke-width: 2px;
+    stroke: green;
+}
+
+.pdb-lig-env-svg-bond-atom-pi {
+    stroke-width: 2px;
+    stroke: #2E8B57;
+}
+
+.pdb-lig-env-svg-bond-amide {
+    stroke-width: 2px;
+    stroke: green;
+}
+
+.pdb-lig-env-svg-bond-vdw {
+    stroke-width: 2px;
+    stroke-dasharray: 10 10;
+    stroke: #9B7653;
+}
+
+.pdb-lig-env-svg-bond-hydrophobic {
+    stroke-width: 0px;
+}
+
+.pdb-lig-env-svg-bond-aromatic {
+    stroke-width: 4px;
+    stroke-dasharray: 1 10;
+    stroke: #AD4379;
+}
+
+.pdb-lig-env-svg-bond-metal {
+    stroke-width: 4px;
+    stroke: #008080;
+}
+
+.pdb-lig-env-svg-bond-clashes {
+    stroke-width: 2px;
+    stroke: #FF5050;
+}
+
+.pdb-lig-env-svg-bond-covalent {
+    stroke-width: 2px;
+    stroke: black;
+}
+
+.pdb-lig-env-svg-bond-other {
+    stroke-width: 1px;
+    stroke: black;
+}
+
+.pdb-lig-env-svg-node circle {
+    stroke-width: 3px;
+}
+
+.pdb-lig-env-svg-node text {
+    cursor: inherit;
+    font-family: sans-serif;
+    stroke: black !important;
+    fill: black !important;
+}
+
+.pdb-lig-env-svg-node text tspan:first-child {
+    cursor: inherit;
+    font-weight: 100;
+    font-size: 1em;
+}
+
+.pdb-lig-env-svg-node text tspan:nth-child(2) {
+    cursor: inherit;
+    font-weight: lighter;
+    font-size: 0.75em;
+}
+
+.pdb-lig-env-svg-ligand-res {
+    stroke: black;
+    fill: white;
+}
+
+.pdb-lig-env-svg-water-res {
+    stroke: #A9A9A9;
+    fill: #00BFFF;
+}
+
+.pdb-lig-env-svg-cystein-res {
+    stroke: #A9A9A9;
+    fill: #F08080;
+}
+
+.pdb-lig-env-svg-positive-res {
+    stroke: #A9A9A9;
+    fill: #F01505;
+}
+
+.pdb-lig-env-svg-negative-res {
+    stroke: #A9A9A9;
+    fill: #C048C0;
+}
+
+.pdb-lig-env-svg-proline-res {
+    stroke: #A9A9A9;
+    fill: #C0C000;
+}
+
+.pdb-lig-env-svg-polar-res {
+    stroke: #A9A9A9;
+    fill: #15C015;
+}
+
+.pdb-lig-env-svg-aromatic-res {
+    stroke: #A9A9A9;
+    fill: #15A4A4;
+}
+
+.pdb-lig-env-svg-hydrophobic-res {
+    stroke: #A9A9A9;
+    fill: #80A0F0;
+}
+
+.pdb-lig-env-svg-glycine-res {
+    stroke: #A9A9A9;
+    fill: #F09048;
+}
+ 
+.pdb-lig-env-svg-other-res {
+    stroke: #A9A9A9;
+    fill: #F2F2F2;
+
+}
\ No newline at end of file
diff --git a/build/pdbe-interactions-styles.css b/src/styles/pdb-ligand-env.css
similarity index 66%
rename from build/pdbe-interactions-styles.css
rename to src/styles/pdb-ligand-env.css
index f50dfa6126d5b81f21bd53e5ac47e98fc1016790..e6181bf2325e9b62e35aba4c55e5e65ab47096f9 100644
--- a/build/pdbe-interactions-styles.css
+++ b/src/styles/pdb-ligand-env.css
@@ -1,11 +1,11 @@
-#int-canvas {
+#pdb-lig-env-root {
     cursor: default;
     border-radius: 3px;
     width: 100%;
-    height: 98.5vh;
+    height: 100%;
 }
 
-.int-label {
+.pdb-lig-env-label {
     position: absolute;
     height: auto;
     padding: 10px;
@@ -16,24 +16,24 @@
     word-wrap: normal;
 }
 
-#int-tooltip {
+#pdb-lig-env-tooltip {
     margin: 10px 0 0 10px;
     bottom: 10px;
 }
 
-#int-tooltip>ul {
+#pdb-lig-env-tooltip>ul {
     margin: 0;
     padding: 0;
     list-style-type: none;
 }
 
-#int-tooltip>ul>li:first-of-type(span) {
+#pdb-lig-env-tooltip>ul>li:first-of-type(span) {
     text-align: left;
     padding: 0px !important;
     font-weight: 900;
 }
 
-.int-menu-panel {
+.pdb-lig-env-menu-panel {
     background: #ccd4e0;
     opacity: 0.9;
     float: right;
@@ -47,28 +47,28 @@
     transition: .2s;
 }
 
-.int-menu-panel>i {
+.pdb-lig-env-menu-panel>i {
     margin-right: 15px;
     cursor: pointer;
     font: 12px sans-serif;
 }
 
-.int-menu-panel>i:last-child {
+.pdb-lig-env-menu-panel>i:last-child {
     margin-right: 0px;
 }
 
-.int-menu-panel>i:hover {
+.pdb-lig-env-menu-panel>i:hover {
     color: #637ca0;
 }
 
-.int-toolbar-container {
+.pdb-lig-env-toolbar-container {
     top: 20px;
     right: 20px;
     position: absolute;
     overflow: hidden;
 }
 
-#int-help-container {
+#pdb-lig-env-help-container {
     font-family: sans-serif;
     background: #f6f5f3;
     display: none;
@@ -87,67 +87,77 @@
     transition: 1s;
 }
 
-#int-help-container:first-child {
+#pdb-lig-env-help-container:first-child {
     font-weight: bold;
 }
 
-#int-residue-label {
+#pdb-lig-env-residue-label {
     margin: 0 0 10px 10px;
     left: 10px;
     top: 10px;
 }
 
-#int-tooltip span:first-child {
+#pdb-lig-env-tooltip span:first-child {
     text-align: left;
     padding-left: 0px !important;
     font-weight: 900;
 }
 
-#int-tooltip span:last-child {
+#pdb-lig-env-tooltip span:last-child {
     padding-left: 10px;
 }
 
-.int-help-table tr {
+.pdb-lig-env-help-table {
+    border: none !important;
+    margin: 0 !important;
+    background-color: #f6f5f3 !important;
+}
+
+.pdb-lig-env-help-table td {
+    border: none !important;
+}
+
+.pdb-lig-env-help-table tr {
     height: 25px;
 }
 
-.int-help-table tr td:first-child {
+.pdb-lig-env-help-table tr td:first-child {
     width: 25px;
     min-width: 25px;
     max-width: 25px;
 }
 
-.int-help-table tr td:nth-child(2) {
+.pdb-lig-env-help-table tr td:nth-child(2) {
     min-width: 100px;
 }
 
-.int-help-table tr td:nth-child(3) {
+.pdb-lig-env-help-table tr td:nth-child(3) {
     width: 25px;
     min-width: 25px;
     max-width: 25px;
 }
 
-#int-help-bonds {
+#pdb-lig-env-help-bonds {
     display: none;
 }
 
-.int-btn:hover {
+.pdb-lig-env-btn:hover {
     color: #637ca0;
 }
 
-.int-help-residue {
+.pdb-lig-env-help-residue {
     width: 20px;
     height: 20px;
     border-radius: 50%;
     border: 1.2px solid #a9a9a9;
 }
 
-.int-help-navbar {
+.pdb-lig-env-help-navbar {
     height: 20px;
     margin-bottom: 10px;
 }
 
-.int-help-navbar a {
+.pdb-lig-env-help-navbar a {
     width: 49%;
     padding-bottom: 5px;
     border: none;
@@ -158,8 +168,7 @@
     cursor: pointer;
 }
 
-.int-help-navbar a.active,
-.int-help-navbar a:hover {
+.pdb-lig-env-help-navbar a.active {
     border-bottom: 2px solid #637ca0;
     color: #637ca0;
 }
\ No newline at end of file
diff --git a/src/ui.ts b/src/ui.ts
deleted file mode 100644
index fb9d01d46c9d5647c80ba7fd5ed800bdc7de1cac..0000000000000000000000000000000000000000
--- a/src/ui.ts
+++ /dev/null
@@ -1,295 +0,0 @@
-/// <reference path="./manager.ts" />
-
-// #region help
-let helpLigands = `
-    <table class='int-help-table'>
-        <tr>
-            <td>
-                <div class="int-help-residue" style="background: #808080; "></div>
-            </td>
-            <td>aliphatic</td>
-            <td>
-                <div class="int-help-residue" style="background: #FF4500;"></div>
-            </td>
-            <td>negativelly charged</td>
-        </tr>
-        <tr>
-            <td>
-                <div class="int-help-residue" style="background: #FFA2FF;"></div>
-            </td>
-            <td>aromatic</td>
-            <td>
-                <div class="int-help-residue" style="background: #C0C0C0;"></div>
-            </td>
-            <td>other</td>
-        </tr>
-        <tr>
-            <td>
-                <div class="int-help-residue" style="background: yellow;"></div>
-            </td>
-            <td>cystein</td>
-            <td>
-                <div class="int-help-residue" style="background: #9DC183;"></div>
-            </td>
-            <td>polar</td>
-            <td>
-        </tr>
-        <tr>
-            <td>
-                <div class="int-help-residue" style="background: #007FFF;"></div>
-            </td>
-            <td>positivelly charged</td>
-            <td>
-                <div class="int-help-residue" style="background: #00BFFF;"></div>
-            </td>
-            <td>water</td>                    
-        </tr>
-        <tr>
-            <td>
-                <div class="int-help-residue" style="background: white; border: 1.2px solid black;"></div>
-            </td>
-            <td>bound molecule</td>
-            <td></td>
-            <td><a href="https://www.ncbi.nlm.nih.gov/glycans/snfg.html" target="blank">glycans (SNFG)</a></td>
-        </tr>
-    </table>
-    `
-let helpBonds = `
-<table class='int-help-table' style="border-bottom: 0.5px solid black; padding-bottom: 10px;">
-<tr>
-    <td>
-        <hr style="border: 0 none; border-top: 5px solid #AD4379; background: none; height: 0;" />
-    </td>
-    <td>aromatic</td>
-    <td>
-            <hr style="border: 0 none; border-top: 5px solid #FF5050; background: none; height: 0;" />
-    </td>
-    <td>clashes</td>
-</tr>
-<tr>
-    <td>
-            <hr style="border: 0 none; border-top: 5px solid black; background: none; height: 0;" />
-    </td>
-    <td>covalent</td>
-    <td>
-            <hr style="border: 0 none; border-top: 5px solid #3F26BF; background: none; height: 0;" />
-    </td>
-    <td>electrostatic</td>
-
-</tr>
-<tr>
-    <td>
-        <hr style="border: 0 none; border-top: 5px solid #008080; background: none; height: 0;" />                        
-    </td>
-    <td>metal</td>
-    <td></td>
-    <td>hydrophobic</td>
-</tr>
-
-<tr>
-    <td>
-        <hr style="border: 0 none; border-top: 5px solid #9B7653; background: none; height: 0;" />
-    </td>
-    <td>vdw</td>
-</tr>
-</table>
-<table class="int-help-table" style="margin-top: 5px;">
-<tr>
-    <td>
-        <hr style="border: 0 none; border-top: 5px solid black; background: none; height: 0;" />
-    </td>
-    <td>covalent</td>
-    <td>
-        <hr style="border: 0 none; border-top: 5px dashed black; background: none; height: 0;" />
-    </td>
-    <td>non-covalent</td>
-</tr>                
-</table>`
-
-// #endregion help
-
-
-
-class UI {
-    private root: HTMLElement;
-    private display: Visualization;
-
-    private residueLabel: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-    private tooltip: d3.Selection<d3.BaseType, {}, HTMLElement, any>;
-
-
-    constructor(element: HTMLElement, vis: Visualization) {
-        this.root = element;
-        this.display = vis;
-
-    }
-
-    public register(params: Model.UIParameters) {
-        if (!Object.keys(params).some(x => params[x])) {
-            return;
-        }
-
-        let toolbar = d3.select(this.root)
-            .append('div')
-            .classed('int-toolbar-container', true)
-            .on('mouseover', () => this.displayToolbarPanel(true))
-            .on('mouseout', () => this.displayToolbarPanel(false));
-
-        toolbar.append('div')
-            .classed('int-menu-panel', true)
-            .append('i')
-            .attr('title', 'Menu')
-            .attr('class', 'icon icon-common icon-bars');
-
-        let dynamicPanel = toolbar.append('div')
-            .classed('int-menu-panel', true)
-            .attr('id', 'int-menu-dynamic-panel')
-            .style('display', 'none')
-            .style('opacity', 0);
-
-        if (params.reinitialize) {
-            dynamicPanel.append('i')
-                .attr('id', 'int-home-btn')
-                .attr('title', 'Reset camera')
-                .attr('class', 'icon icon-common icon-sync-alt')
-                .on('click', () => this.reinitialize());
-        }
-
-        if (params.downloadImage) {
-            dynamicPanel.append('i')
-                .attr('id', 'int-screenshot-btn')
-                .attr('title', 'Save SVG')
-                .attr('class', 'icon icon-common icon-camera')
-                .on('click', () => this.saveSVG());
-        }
-
-        if (params.downloadData) {
-            dynamicPanel.append('i')
-                .attr('id', 'int-download-btn')
-                .attr('title', 'Download interactions')
-                .attr('class', 'icon icon-common icon-download')
-                .on('click', () => this.download());
-        }
-
-        if (params.center) {
-            dynamicPanel.append('i')
-                .attr('id', 'int-center-btn')
-                .attr('title', 'Center screeeeeeeeeeeen')
-                .attr('class', 'icon icon-common icon-crosshairs')
-                .on('click', () => this.center());
-        }
-
-        if (params.help) {
-            dynamicPanel.append('i')
-                .attr('id', 'int-help-btn')
-                .attr('title', 'Show help')
-                .attr('class', 'icon icon-common icon-question-circle')
-                .on('click', () => this.showHelp());
-
-            let cont = d3.select(this.root).append('div').attr('id', 'int-help-container')
-            let navbar = cont.append('div').classed('int-help-navbar', true);
-
-            navbar.append('a')
-                .classed('active', true)
-                .attr('id', 'int-help-residues-btn')
-                .text('Ligands and residues')
-                .on('click', () => this.changeHelp(true));
-
-            navbar.append('a')
-                .classed('active', true)
-                .attr('id', 'int-help-bonds-btn')
-                .text('Interactions')
-                .on('click', () => this.changeHelp(false));
-
-            cont.append('div').attr('id', 'int-help-ligands').html(helpLigands);
-            cont.append('div').attr('id', 'int-help-bonds').html(helpBonds);
-        }
-
-        if (params.tooltip) {
-            this.tooltip = d3.select(this.root).append('div')
-                .classed('int-label', true)
-                .attr('id', 'int-tooltip')
-                .style('opacity', 0)
-        }
-
-        if (params.residueLabel) {
-            this.residueLabel = d3.select(this.root).append('div')
-                .classed('int-label', true)
-                .attr('id', 'int-residue-label')
-                .style('opacity', 0)
-        }
-
-        console.log(this.residueLabel);
-        console.log(this.tooltip);
-    }
-
-    // #region UI methods
-    private saveSVG() {
-        this.display.saveSvg(this.display);
-    }
-
-    private reinitialize() {
-        this.display.reinitialize(this.display)
-    }
-
-    private download() {
-        this.display.downloadInteractionsData(this.display)
-    }
-
-    private center() {
-        this.display.centerScene(this.display)
-    }
-
-    private changeHelp(showResidues: boolean) {
-        let ligHelpBtn = d3.select('#int-help-residues-btn');
-        let bondHelpBtn = d3.select('#int-help-bonds-btn');
-        let bondHelpSection = d3.select('#int-help-bonds');
-        let ligHelpSection = d3.select('#int-help-ligands');
-
-        if (showResidues) {
-            bondHelpBtn.classed('active', false);
-            ligHelpBtn.classed('active', true);
-            bondHelpSection.style('display', 'none');
-            ligHelpSection.style('display', 'block');
-
-        } else {
-            ligHelpBtn.classed('active', false);
-            bondHelpBtn.classed('active', true);
-            bondHelpSection.style('display', 'block');
-            ligHelpSection.style('display', 'none');
-        }
-    }
-
-    showHelp() {
-        let el = d3.select('#int-help-container');
-        let btn = d3.select('#int-help-btn');
-
-        if (el.style('display') === 'block') {
-            el.style('display', 'none');
-            el.style('opacity', 0);
-            btn.style('color', '');
-        } else {
-            el.style('display', 'block');
-            el.style('opacity', 1);
-            btn.style('color', '#637ca0');
-        }
-    }
-
-    displayToolbarPanel(show: boolean) {
-        let dynPanel = d3.select('#int-menu-dynamic-panel');
-        let el = d3.select('#int-help-container');
-
-        if (!dynPanel && !el) return;
-
-        if (show || el.style('display') === 'block') {
-            dynPanel.style('display', 'block');
-            dynPanel.style('opacity', 0.9);
-        } else {
-
-            dynPanel.style('display', 'none');
-            dynPanel.style('opacity', 0);
-        }
-    }
-
-    // #endregion UI methods
-}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 60d88a78fce6291f10fd7e17e883ce79c524c29d..2fa5b589702ad83a3eceda9794feb05be9e84cc0 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,23 +5,17 @@
         "noUnusedLocals": true,
         "noUnusedParameters": true,
         "target": "es2016",
-        "lib": [ "es5", "es6", "es7", "es2015.collection", "dom", "es2015.promise"],
+        "lib": ["es5", "es6", "es7", "es2015.collection", "dom", "es2015.promise"],
         "sourceMap": false,
         "declaration": true,
         "module": "none",
-        "moduleResolution": "node",        
-        "out": "build/app.js"
-    },    
-    "files": [
-        "src/model.ts",     
-        "src/ui.ts",   
-        "src/manager.ts",
-        "src/visualsMapping.ts",
-        "src/depiction.ts",               
-    ],
+        "moduleResolution": "node",
+        "out": "build/pdb-ligand-env-plugin.js"
+    },
+    "include": ["src/plugin/**/*", ],
     "exclude": [
         "node_modules",
         "build",
-        "dist"      
+        "dist"
     ]
 }
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
index 2d28104fcfbdc73cc527d47b674c11dbbf56e906..3019b60204e44c0646629b34fa65596469538e29 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -4,74 +4,55 @@ const camelCase = require("camelcase");
 const CleanWebpackPlugin = require("clean-webpack-plugin");
 
 const PACKAGE_ROOT_PATH = process.cwd();
-const PKG_JSON = require(path.join(PACKAGE_ROOT_PATH, "package.json"));
 
 const config = {
-  entry: ["./src/component.js"],
+  entry: ["./src/component/component.js"],
   output: {
     path: path.resolve(PACKAGE_ROOT_PATH, "build"),
-    filename: "component.js"
+    filename: "pdb-ligand-env-component-init.js"
   },
   target: "web",
   devtool: "source-map",
   resolve: {
     extensions: [".js"]
   },
-//   externals: {
-//     d3: "d3",
-//     "protvista-track": "ProtvistaTrack",
-//     "protvista-sequence": "ProtvistaSequence",
-//     "resize-observer-polyfill": "ResizeObserver"
-//   },
-//   plugins: [new CleanWebpackPlugin([path.join(PACKAGE_ROOT_PATH, "dist")])],
   module: {
     rules: [
-    //   {
-    //     test: /\.css$/,
-    //     use: [
-    //       "style-loader",
-    //       { loader: "css-loader", options: { importLoaders: 1 } }
-    //     ]
-    //   },
-    //   {
-    //     test: /.(jpg|jpeg|png|svg)$/,
-    //     use: ['url-loader'],
-    //   },
+      {
+        test: /\.css$/,
+        use: [
+          "style-loader",
+          { loader: "css-loader", options: { importLoaders: 1 } }
+        ]
+      },
+      {
+        test: /.(jpg|jpeg|png|svg)$/,
+        use: ['url-loader'],
+      },
       {
         test: /\.(js)$/,
-        exclude: function excludeCondition(path){
-            
-            const nonEs5SyntaxPackages = [
-              'lit-element',
-              'lit-html'
-            ]
-            
-            // DO transpile these packages
-            if (nonEs5SyntaxPackages.some( pkg => path.match(pkg))) {
-              return false;
-            }
-          
-            // Ignore all other modules that are in node_modules
-            if (path.match(/node_modules\\/)) { return true; }
-          
-            else return false;
-          },
+        exclude: function excludeCondition(path) {
+
+          const nonEs5SyntaxPackages = [
+            'lit-element',
+            'lit-html'
+          ]
+
+          // DO transpile these packages
+          if (nonEs5SyntaxPackages.some(pkg => path.match(pkg))) {
+            return false;
+          }
+
+          // Ignore all other modules that are in node_modules
+          if (path.match(/node_modules\\/)) { return true; }
+
+          else return false;
+        },
         use: {
           loader: "babel-loader",
           options: {
             babelrc: false,
-            presets: [
-              // [
-              //   "@babel/preset-env",
-              //   {
-              //     targets: {
-              //       ie: 11,
-              //       browsers: "last 2 versions"
-              //     },
-              //     modules: false
-              //   }
-              // ]
-            ],
+            presets: [],
             plugins: [
               [
                 "@babel/plugin-transform-runtime",