~harmless/security.txt

192a63395479b4257f3742784ec453842e8573a8 — Travis Paul 1 year, 9 months ago 614b6f2
Initial baseline commit, working across several browsers and platforms.
A .gitignore => .gitignore +3 -0
@@ 0,0 1,3 @@
node_modules/
build/
.DS_Store

A .jshintrc => .jshintrc +14 -0
@@ 0,0 1,14 @@
{
  "curly": true, 
  "eqeqeq": true,
  "latedef": true,
  "undef": true,
  "unused": true,
  "browser": true,
  "esversion": 6,
  "globals": {
    "browser": true,
    "console": true,
    "chrome": true
  }
}

A .jshintrc.node => .jshintrc.node +9 -0
@@ 0,0 1,9 @@
{
  "curly": true, 
  "eqeqeq": true,
  "latedef": true,
  "undef": true,
  "unused": true,
  "node": true,
  "esversion": 6
}

A Gruntfile.js => Gruntfile.js +105 -0
@@ 0,0 1,105 @@
'use strict';

const browsers = ['firefox', 'chrome', 'opera', 'edge'];

module.exports = function(grunt) {
 
  require('load-grunt-tasks')(grunt);

  grunt.initConfig({
    package: grunt.file.readJSON('package.json'),
    manifest: grunt.file.readJSON('src/manifest.json'),
    browsers: browsers,
    mkdir: {
      all: {
        options: {
          create: browsers.map(browser => `build/${browser}`)
        }
      }
    },
    clean: {
      all: ['build']
    },
    copy: {
      all: {
        files: browsers.map((browser) => {
          return {
            expand: true,
            cwd: 'src/',
            src: ['**', '!manifest*json'],
            dest: `build/${browser}`
          };
        })
      },
      polyfill: {
        files: browsers.map((browser) => {
          return {
            src: 'node_modules/webextension-polyfill/dist/browser-polyfill.js',
            dest: `build/${browser}/js/browser-polyfill.js`
          };
        })
      }
    },
    jshint: {
      extension: {
        options: {
          jshintrc: '.jshintrc'
        },
        src: [
          'src/js/**.js',
          '!src/js/backgroundScriptsAPIBridge.js',
          '!src/js/contentScriptsAPIBridge.js'
        ]
      },
      node: {
        options: {
          jshintrc: '.jshintrc.node'
        },
        src: ['Gruntfile.js']
      },
    }
  });

  grunt.registerTask('manifests', 'Combine manifest.json files', function () {
    function rmNotes(obj) {
      const notesRegExp = new RegExp('^_notes_');
      Object.keys(obj).forEach((key) => {
        if (notesRegExp.test(key)) {
          delete obj[key];
        }
      });
    }

    const pkg = grunt.config.get('package');
    const manifest = grunt.config.get('manifest');

    manifest.name = pkg.name;
    manifest.version = pkg.version;
    manifest.author = pkg.author;
    manifest.homepage_url = pkg.homepage;

    rmNotes(manifest);
    
    grunt.log.subhead('Creating browser specific manifest files');

    browsers.forEach((browser) => {
      const browserManifest = grunt.file.readJSON(`src/manifest.${browser}.json`);
      const manifestCopy = Object.assign({}, manifest);
      const filePath = `build/${browser}/manifest.json`;
      rmNotes(browserManifest);
      Object.assign(manifestCopy, browserManifest);
      grunt.file.write(filePath, JSON.stringify(manifestCopy, null, 2));
      grunt.log.ok(filePath);
    });
  });

  grunt.registerTask('default', [
    'jshint:extension',
    'jshint:node',
    'clean',
    'mkdir',
    'manifests',
    'copy',
    'copy:polyfill'
  ]);
};

M README.md => README.md +13 -2
@@ 1,2 1,13 @@
# security.txt
 Cross-platform browser extension for security.txt and humans.txt files.
security.txt
Cross-platform browser extension for security.txt and humans.txt files.

As you browse the web, this extension will check for a [security.txt](https://tools.ietf.org/html/draft-foudil-securitytxt-08) 
and [humans.txt](http://humanstxt.org) file on each site you visit. If either file exists, the pageAction can be clicked to 
display the files.

## Developer Quick Reference

- [Firefox Browser Extensions MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions)
- [Chrome Extension Developer Guide](https://developer.chrome.com/extensions/devguide)
- [Opera Extensions Documentation](https://dev.opera.com/extensions/)
- [Microsoft Edge (EdgeHTML) extensions](https://docs.microsoft.com/en-us/microsoft-edge/extensions/)
\ No newline at end of file

A package.json => package.json +23 -0
@@ 0,0 1,23 @@
{
  "name": "security.txt",
  "version": "1.0.0",
  "description": "Cross-platform browser extension for security.txt and humans.txt files.",
  "homepage": "https://www.harmless.systems/products/security-txt.html",
  "main": "Gruntfile.js",
  "repository": "git@github.com:HarmlessSystems/security.txt.git",
  "author": "Harmless Systems <info@harmless.systems>",
  "license": "BSD-2-Clause",
  "scripts": {
    "build": "node_modules/.bin/grunt"
  },
  "devDependencies": {
    "grunt": "^1.0.4",
    "grunt-cli": "^1.3.2",
    "grunt-contrib-clean": "^2.0.0",
    "grunt-contrib-copy": "^1.0.0",
    "grunt-contrib-jshint": "^2.1.0",
    "grunt-mkdir": "^1.0.0",
    "load-grunt-tasks": "^5.1.0",
    "webextension-polyfill": "^0.6.0"
  }
}

A security.txt => security.txt +23 -0
@@ 0,0 1,23 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Contact: mailto:security@harmless.systems
Encryption: https://www.harmless.systems/pgp.txt
Preferred-Languages: en
Canonical: https://www.harmless.systems/.well-known/security.txt
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEeMmm6tovSoPQaXo1LPLT0YMTN3sFAl4AT5cACgkQLPLT0YMT
N3u+8w//ekTyhm0bK4M4jMm27edj+gyC6XQJwTi7/PV1LsTRrZblRZK/1ZkjUztc
4BdgMMlOHVwYHGDqOQR8p4vSzb7sFYKYBBiA6Mh7sLr2ekZWDj5d68/k5cTRNrGD
8hU6ts8y6q3rgAcSygiYOZglcA64Gy2XW8Rqn8udndrqfB3Llu5SKMzQ9M2Henop
Ih01rTkIsPs8JVEw+JjZW+bn1/5h3pqNv5lpME/X/Y4hbWbHcLl7/u4GqwYnJm4R
QoEKq3iTnrTZYKJyF+57kZq/VXHQ8OIEKG4CMge3uVqSRRZinimvVsq9TCqwCc2E
07+SKkib6Nvn79KYN6Q0+X6FqhKloPKIjEbdM+RUuFnLl/9/xdiwnSZG3FuAQD3S
LSzDoL/V7s1diQoM5b7Daf/Ho+iH60Vm2QECcuAuLg/UCpdaS0MyEEua1jTLVnxq
Z8PomG+mH6vL9tCd8EZ+uuJYKTL3EOLywYMa115kUvoUl4rxtaVOWCIEKudeGWLp
2iYrgERKX0uFIEYwAHDDtXDq2sVsHybxXW7ViiXyiST+na7LYyMA8c4EUQ6YTkZB
hOAY+7222wY9jAmpxbGTS9LHBMrd6ObaRovfR8y62I+UYyyMMOyTcBXeM6wzfIJj
nbGo6Xyxd0xGVCJDYHHbT/c5vLr598B8Vujqi/NoeYE61fNe0gA=
=j+Yx
-----END PGP SIGNATURE-----

A src/_locales/en/messages.json => src/_locales/en/messages.json +114 -0
@@ 0,0 1,114 @@
{
  "extension_description": {
    "message": "Displays the security.txt and humans.txt files for a website if available.",
    "description" : "Description of extension"
  },
  "options_title": {
    "message": "Preferences",
    "description" : "Title text of options page"
  },
  "display_mode": {
    "message": "Display mode: ",
    "description" : "Label text for display mode selection drop-down"
  },
  "display_mode_INLINE": {
    "message": "In the same window",
    "description" : "Description for INLINE display mode"
  },
  "display_mode_NEW_TAB": {
    "message": "In a new tab",
    "description" : "Description for NEW_TAB display mode"
  },
  "display_mode_NEW_WINDOW": {
    "message": "In a new window",
    "description" : "Description for NEW_WINDOW display mode"
  },
  "check_humanstxt": {
    "message": "Also check for a humans.txt file: ",
    "description" : "Label text for humans.txt option"
  },
  "check_humanstxt_ON": {
    "message": "Enabled",
    "description" : "Description for enabling check_humanstxt option"
  },
  "check_humanstxt_OFF": {
    "message": "Disabled",
    "description" : "Description for disabling check_humanstxt option"
  },
  "color_theme": {
    "message": "Preferred color theme",
    "description" : "Label text for color theme option"
  },
  "color_theme_AUTO": {
    "message": "Automatic",
    "description" : "Automatic based on system theme"
  },
  "color_theme_DARK": {
    "message": "Dark Mode",
    "description" : "Dark theme"
  },
  "color_theme_LIGHT": {
    "message": "Light Mode",
    "description" : "Light theme"
  },
  "host_cache_ttl": {
    "message": "Host cache time-to-live",
    "description" : "How long should hostnames be cached?"
  },
  "host_cache_ttl_10M": {
    "message": "10 minutes or until browser is closed",
    "description" : "Cache for 10 minutes"
  },
  "host_cache_ttl_1H": {
    "message": "1 hour or until browser is closed",
    "description" : "Cache for 1 hour"
  },
  "host_cache_ttl_24H": {
    "message": "1 day or until browser is closed",
    "description" : "Cache for 1 day"
  },
  "host_cache_ttl_ALWAYS": {
    "message": "Until browser is closed",
    "description" : "Cache until process is terminated"
  },
  "host_cache_ttl_NEVER": {
    "message": "Disable in_memory cache",
    "description" : "Perform no caching"
  },
  "reset_default": {
    "message": "Reset all preferences to default values",
    "description" : "Button text to set all options to the default"
  },
  "found_security_txt": {
    "message": "Found security.txt",
    "description" : "pageAction title when only security.txt is found."
  },
   "found_humans_txt": {
    "message": "Found humans.txt",
    "description" : "pageAction title when only humans.txt is found."
  },
  "found_security_and_humans_txt": {
    "message": "Found security.txt and humans.txt",
    "description" : "pageAction title when both security.txt and humans.txt are found."
  },
  "install_title": {
    "message": "Thanks for installing",
    "description" : "Page title for welcome page after installation of extension"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update"
  },
  "copy_clipboard": {
    "message": "Copy to clipboard",
    "description" : "Text for button to copy text to clipboard."
  },
  "copied_humans_to_clipboard": {
    "message": "Copied humans.txt!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard"
  },
  "copied_security_to_clipboard": {
    "message": "Copied security.txt!",
    "description" : "Message shown when secxurity.txt text has been copied to the clipboard"
  }
}
\ No newline at end of file

A src/background.html => src/background.html +11 -0
@@ 0,0 1,11 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
  </head>
  <body>
    <!-- This background page is only used for Edge -->
    <script type="text/javascript" src="js/global.js"></script>
    <script type="text/javascript" src="js/background.js"></script>
  </body>
</html>
\ No newline at end of file

A src/css/awsm.css => src/css/awsm.css +679 -0
@@ 0,0 1,679 @@
@charset "UTF-8";
/*!
 * awsm.css v3.0.4 (https://igoradamenko.github.io/awsm.css/)
 * Copyright 2015 Igor Adamenko <mail@igoradamenko.com> (https://igoradamenko.com)
 * Licensed under MIT (https://github.com/igoradamenko/awsm.css/blob/master/LICENSE.md)
 */
html{
  font-family:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "PT Sans", "Open Sans", "Fira Sans", "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size:100%;
  line-height:1.4;
  background:white;
  color:black;
  -webkit-overflow-scrolling:touch;
}

body{
  margin:1.2em;
  font-size:1rem;
}
@media (min-width: 20rem){
  body{
    font-size:calc(1rem + 0.00625 * (100vw - 20rem));
  }
}
@media (min-width: 40rem){
  body{
    font-size:1.125rem;
  }
}
body header,
body main,
body footer,
body article{
  position:relative;
  max-width:40rem;
  margin:0 auto;
}
body > header{
  margin-bottom:3.5em;
}
body > header h1{
  margin:0;
  font-size:1.5em;
}
body > header p{
  margin:0;
  font-size:0.85em;
}
body > footer{
  margin-top:6em;
  padding-bottom:1.5em;
  text-align:center;
  font-size:0.8rem;
  color:#aaaaaa;
}

nav{
  margin:1em 0;
}
nav ul{
  list-style:none;
  margin:0;
  padding:0;
}
nav li{
  display:inline-block;
  margin-right:1em;
  margin-bottom:0.25em;
}
nav a:visited{
  color:#0064c1;
}
nav a:hover{
  color:#f00000;
}

ul, ol{
  margin-top:0;
  padding-top:0;
  padding-left:2.5em;
}
ul li + li, ol li + li{
  margin-top:0.25em;
}
ul li > details, ol li > details{
  margin:0;
}

p{
  margin:1em 0;
  -webkit-hyphens:auto;
      -ms-hyphens:auto;
          hyphens:auto;
}
p:first-child{
  margin-top:0;
}
p:last-child{
  margin-bottom:0;
}
p + ul, p + ol{
  margin-top:-0.75em;
}
p img, p picture{
  float:right;
  margin-bottom:0.5em;
  margin-left:0.5em;
}
p picture img{
  float:none;
  margin:0;
}

dd{
  margin-bottom:1em;
  margin-left:0;
  padding-left:2.5em;
}

dt{
  font-weight:700;
}

blockquote{
  margin:0;
  padding-left:2.5em;
}

aside{
  margin:0.5em 0;
  font-style:italic;
  color:#aaaaaa;
}
@media (min-width: 65rem){
  aside{
    position:absolute;
    right:-12.5rem;
    width:9.375rem;
    max-width:9.375rem;
    margin:0;
    padding-left:0.5em;
    font-size:0.8em;
    border-left:1px solid #f2f2f2;
  }
}
aside:first-child{
  margin-top:0;
}
aside:last-child{
  margin-bottom:0;
}

section + section{
  margin-top:2em;
}

h1, h2, h3, h4, h5, h6{
  margin:1.25em 0 0;
  line-height:1.2;
}
h1:hover > a[href^="#"][id]:empty, h1:focus > a[href^="#"][id]:empty, h2:hover > a[href^="#"][id]:empty, h2:focus > a[href^="#"][id]:empty, h3:hover > a[href^="#"][id]:empty, h3:focus > a[href^="#"][id]:empty, h4:hover > a[href^="#"][id]:empty, h4:focus > a[href^="#"][id]:empty, h5:hover > a[href^="#"][id]:empty, h5:focus > a[href^="#"][id]:empty, h6:hover > a[href^="#"][id]:empty, h6:focus > a[href^="#"][id]:empty{
  opacity:1;
}
h1 + p, h1 + details, h2 + p, h2 + details, h3 + p, h3 + details, h4 + p, h4 + details, h5 + p, h5 + details, h6 + p, h6 + details{
  margin-top:0.5em;
}
h1 > a[href^="#"][id]:empty, h2 > a[href^="#"][id]:empty, h3 > a[href^="#"][id]:empty, h4 > a[href^="#"][id]:empty, h5 > a[href^="#"][id]:empty, h6 > a[href^="#"][id]:empty{
  position:absolute;
  left:-0.65em;
  opacity:0;
  text-decoration:none;
  font-weight:400;
  line-height:1;
  color:#aaaaaa;
}
@media (min-width: 40rem){
  h1 > a[href^="#"][id]:empty, h2 > a[href^="#"][id]:empty, h3 > a[href^="#"][id]:empty, h4 > a[href^="#"][id]:empty, h5 > a[href^="#"][id]:empty, h6 > a[href^="#"][id]:empty{
    left:-0.8em;
  }
}
h1 > a[href^="#"][id]:empty:target, h1 > a[href^="#"][id]:empty:hover, h1 > a[href^="#"][id]:empty:focus, h2 > a[href^="#"][id]:empty:target, h2 > a[href^="#"][id]:empty:hover, h2 > a[href^="#"][id]:empty:focus, h3 > a[href^="#"][id]:empty:target, h3 > a[href^="#"][id]:empty:hover, h3 > a[href^="#"][id]:empty:focus, h4 > a[href^="#"][id]:empty:target, h4 > a[href^="#"][id]:empty:hover, h4 > a[href^="#"][id]:empty:focus, h5 > a[href^="#"][id]:empty:target, h5 > a[href^="#"][id]:empty:hover, h5 > a[href^="#"][id]:empty:focus, h6 > a[href^="#"][id]:empty:target, h6 > a[href^="#"][id]:empty:hover, h6 > a[href^="#"][id]:empty:focus{
  opacity:1;
  box-shadow:none;
  color:black;
}
h1 > a[href^="#"][id]:empty:target:focus, h2 > a[href^="#"][id]:empty:target:focus, h3 > a[href^="#"][id]:empty:target:focus, h4 > a[href^="#"][id]:empty:target:focus, h5 > a[href^="#"][id]:empty:target:focus, h6 > a[href^="#"][id]:empty:target:focus{
  outline:none;
}
h1 > a[href^="#"][id]:empty::before, h2 > a[href^="#"][id]:empty::before, h3 > a[href^="#"][id]:empty::before, h4 > a[href^="#"][id]:empty::before, h5 > a[href^="#"][id]:empty::before, h6 > a[href^="#"][id]:empty::before{
  content:"§ ";
}

h1{
  font-size:2.5em;
}

h2{
  font-size:1.75em;
}

h3{
  font-size:1.25em;
}

h4{
  font-size:1.15em;
}

h5{
  font-size:1em;
}

h6{
  margin-top:1em;
  font-size:1em;
  color:#aaaaaa;
}

article + article{
  margin-top:4em;
}
article header p{
  font-size:0.6em;
  color:#aaaaaa;
}
article header p + h1, article header p + h2{
  margin-top:-0.25em;
}
article header h1 + p, article header h2 + p{
  margin-top:0.25em;
}
article header h1 a, article header h2 a{
  color:black;
}
article header h1 a:visited, article header h2 a:visited{
  color:#aaaaaa;
}
article header h1 a:visited:hover, article header h2 a:visited:hover{
  color:#f00000;
}
article > footer{
  margin-top:1.5em;
  font-size:0.85em;
}

a{
  color:#0064c1;
}
a:visited{
  color:#8d39d0;
}
a:hover, a:active{
  outline-width:0;
}
a:hover{
  color:#f00000;
}
a abbr{
  font-size:1em;
}

abbr{
  margin-right:-0.075em;
  text-decoration:none;
  -webkit-hyphens:none;
      -ms-hyphens:none;
          hyphens:none;
  letter-spacing:0.075em;
  font-size:0.9em;
}

img, picture{
  display:block;
  max-width:100%;
  margin:0 auto;
}

audio, video{
  width:100%;
  max-width:100%;
}

figure{
  margin:1em 0 0.5em;
  padding:0;
}
figure + p{
  margin-top:0.5em;
}
figure figcaption{
  opacity:0.65;
  font-size:0.85em;
}

table{
  display:inline-block;
  border-spacing:0;
  border-collapse:collapse;
  overflow-x:auto;
  max-width:100%;
  text-align:left;
  vertical-align:top;
  background:linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 0 0, linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 100% 0;
  background-attachment:scroll, scroll;
  background-size:1px 100%, 1px 100%;
  background-repeat:no-repeat, no-repeat;
}
table caption{
  font-size:0.9em;
  background:white;
}
table td, table th{
  padding:0.35em 0.75em;
  vertical-align:top;
  font-size:0.9em;
  border:1px solid #f2f2f2;
  border-top:0;
  border-left:0;
}
table td:first-child, table th:first-child{
  padding-left:0;
  background-image:linear-gradient(to right, white 50%, rgba(255, 255, 255, 0) 100%);
  background-size:2px 100%;
  background-repeat:no-repeat;
}
table td:last-child, table th:last-child{
  padding-right:0;
  border-right:0;
  background-image:linear-gradient(to left, white 50%, rgba(255, 255, 255, 0) 100%);
  background-position:100% 0;
  background-size:2px 100%;
  background-repeat:no-repeat;
}
table td:only-child, table th:only-child{
  background-image:linear-gradient(to right, white 50%, rgba(255, 255, 255, 0) 100%), linear-gradient(to left, white 50%, rgba(255, 255, 255, 0) 100%);
  background-position:0 0, 100% 0;
  background-size:2px 100%, 2px 100%;
  background-repeat:no-repeat, no-repeat;
}
table th{
  line-height:1.2;
}

form{
  margin-right:auto;
  margin-left:auto;
}
@media (min-width: 40rem){
  form{
    max-width:80%;
  }
}
form select, form label{
  display:block;
}
form label:not(:first-child){
  margin-top:1em;
}
form p label{
  display:inline;
}
form p label + label{
  margin-left:1em;
}
form legend:first-child + label{
  margin-top:0;
}
form select, form input[type], form textarea{
  margin-bottom:1em;
}
form input[type=checkbox], form input[type=radio]{
  margin-bottom:0;
}

fieldset{
  margin:0;
  padding:0.5em 1em;
  border:1px solid #aaaaaa;
}

legend{
  color:#aaaaaa;
}

button{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
}
button:focus{
  border:1px solid black;
}
button:hover{
  border:1px solid black;
}
button:active{
  background-color:#aaaaaa;
}

select{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  padding-right:1.2em;
  background-position:top 55% right 0.35em;
  background-size:0.5em;
  background-repeat:no-repeat;
  -webkit-appearance:button;
     -moz-appearance:button;
          appearance:button;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3Cpath fill='rgb(170, 170, 170)' fill-rule='nonzero' d='M1.5 2L3 0H0z'/%3E%3C/svg%3E");
}
select:focus{
  border:1px solid black;
}
select:hover{
  border:1px solid black;
}
select:active{
  background-color:#aaaaaa;
}
select:focus, select:hover{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3Cpath fill='rgb(0, 0, 0)' fill-rule='nonzero' d='M1.5 2L3 0H0z'/%3E%3C/svg%3E");
}

input[type=text], input[type=password], input[type^=date], input[type=email], input[type=number], input[type=search], input[type=tel], input[type=time], input[type=month], input[type=week], input[type=url]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
}
input[type=text]:focus, input[type=password]:focus, input[type^=date]:focus, input[type=email]:focus, input[type=number]:focus, input[type=search]:focus, input[type=tel]:focus, input[type=time]:focus, input[type=month]:focus, input[type=week]:focus, input[type=url]:focus{
  border:1px solid black;
}
input[type=text]::-moz-placeholder, input[type=password]::-moz-placeholder, input[type^=date]::-moz-placeholder, input[type=email]::-moz-placeholder, input[type=number]::-moz-placeholder, input[type=search]::-moz-placeholder, input[type=tel]::-moz-placeholder, input[type=time]::-moz-placeholder, input[type=month]::-moz-placeholder, input[type=week]::-moz-placeholder, input[type=url]::-moz-placeholder{
  color:#aaaaaa;
}
input[type=text]::-webkit-input-placeholder, input[type=password]::-webkit-input-placeholder, input[type^=date]::-webkit-input-placeholder, input[type=email]::-webkit-input-placeholder, input[type=number]::-webkit-input-placeholder, input[type=search]::-webkit-input-placeholder, input[type=tel]::-webkit-input-placeholder, input[type=time]::-webkit-input-placeholder, input[type=month]::-webkit-input-placeholder, input[type=week]::-webkit-input-placeholder, input[type=url]::-webkit-input-placeholder{
  color:#aaaaaa;
}
input[type=text]:-ms-input-placeholder, input[type=password]:-ms-input-placeholder, input[type^=date]:-ms-input-placeholder, input[type=email]:-ms-input-placeholder, input[type=number]:-ms-input-placeholder, input[type=search]:-ms-input-placeholder, input[type=tel]:-ms-input-placeholder, input[type=time]:-ms-input-placeholder, input[type=month]:-ms-input-placeholder, input[type=week]:-ms-input-placeholder, input[type=url]:-ms-input-placeholder{
  color:#aaaaaa;
}
input[type=submit], input[type=button], input[type=reset]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
}
input[type=submit]:focus, input[type=button]:focus, input[type=reset]:focus{
  border:1px solid black;
}
input[type=submit]:hover, input[type=button]:hover, input[type=reset]:hover{
  border:1px solid black;
}
input[type=submit]:active, input[type=button]:active, input[type=reset]:active{
  background-color:#aaaaaa;
}
input[type=color]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
  width:6em;
}
input[type=color]:focus{
  border:1px solid black;
}
input[type=color]::-moz-placeholder{
  color:#aaaaaa;
}
input[type=color]::-webkit-input-placeholder{
  color:#aaaaaa;
}
input[type=color]:-ms-input-placeholder{
  color:#aaaaaa;
}
input[type=color]:hover{
  border:1px solid black;
}
input[type=file]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  display:block;
  width:100%;
  height:auto;
  padding:0.75em 0.5em;
  font-size:12px;
  line-height:1;
}
input[type=file]:focus{
  border:1px solid black;
}
input[type=file]:hover{
  border:1px solid black;
}
input[type=file]:active{
  background-color:#aaaaaa;
}
input[type=checkbox], input[type=radio]{
  margin:-0.2em 0.75em 0 0;
  vertical-align:middle;
}

textarea{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
  height:4.5em;
  resize:vertical;
  padding-top:0.5em;
  padding-bottom:0.5em;
}
textarea:focus{
  border:1px solid black;
}
textarea::-moz-placeholder{
  color:#aaaaaa;
}
textarea::-webkit-input-placeholder{
  color:#aaaaaa;
}
textarea:-ms-input-placeholder{
  color:#aaaaaa;
}

output{
  display:block;
}

code, kbd, var, samp{
  font-family:Consolas, "Lucida Console", Monaco, monospace;
  font-style:normal;
}

pre{
  overflow-x:auto;
  font-size:0.8em;
  background:linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 0 0, linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 100% 0;
  background-attachment:scroll, scroll;
  background-size:1px 100%, 1px 100%;
  background-repeat:no-repeat, no-repeat;
}
pre > code{
  display:inline-block;
  overflow-x:visible;
  box-sizing:border-box;
  min-width:100%;
  border-right:3px solid white;
  border-left:1px solid white;
}

hr{
  height:1px;
  margin:2em 0;
  border:0;
  background:#f2f2f2;
}

details{
  margin:1em 0;
}
details[open]{
  padding-bottom:0.5em;
  border-bottom:1px solid #f2f2f2;
}

summary{
  display:inline-block;
  font-weight:700;
  border-bottom:1px dashed;
  cursor:pointer;
}
summary::-webkit-details-marker{
  display:none;
}

noscript{
  color:#d00000;
}

::selection{
  background:rgba(0, 100, 193, 0.25);
}
\ No newline at end of file

A src/css/options.css => src/css/options.css +32 -0
@@ 0,0 1,32 @@
body {
  padding-top: 1em;
  font-size: 15px;
}

form > div {
  padding: 0.25em;
}

select {
  cursor: pointer;
}

button {
  margin-top: 2em;
  cursor: pointer;
}

@media (prefers-color-scheme: dark) {
  body {
    color: white;
    background: #202023;
  }
}

@media (prefers-color-scheme: light) {
  body {
    color: #202023;
    background: white;
  }
}


A src/css/popup.css => src/css/popup.css +93 -0
@@ 0,0 1,93 @@
* {
  margin: 0;
  padding: 0;
}
body {
  overflow: hidden;
  min-width:600px;
}
.tabs {
  background: #fff;
  height:100%;
}
.tabs h2 {
  text-align: center;
}
.tabs input {
  display: none;
}
.tabs label {
  box-sizing: border-box;
  display: inline-block;
  padding: 15px 25px;
  color: #ccc;
  margin-bottom: -1px;
  margin-left: -1px;
}
.tabs label:before {
  content:'';
  display:block;
  width:100%;
  height:15px;
  background-color:#fff;
  position:absolute;
  bottom:-11px;
  left:0;
  z-index:10;  
}
.tabs label:hover {
  color: #888;
  cursor: pointer;
}
.tabs input:checked + label {
  position: relative;
  color: #000;
  background: #fff;
  border-left: 1px solid #bbb;
  border-right: 1px solid #bbb;
  border-bottom: 1px solid #fff;
}
.tabs input:checked + label:after {
  display: block;
  content: '';
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}
#securitytxt, #humanstxt{
  display: none;
  border-top: 1px solid #bbb;
  padding:5px;
}
#securitytab:checked ~ #securitytxt,
#humanstab:checked ~ #humanstxt {
  display: block;
}

textarea {
  padding-top: 25px;
  border:none;
  width:100%;
  min-height:300px;
  font-family: monospace;
  margin-top:5px;
  border:none;
}

textarea:focus {
  border:none;
}

button {
  opacity: 0.45;
  position:absolute;
  right:20px;
  top:55px;
  background:rgba(225,225,225,0.8);
  cursor: pointer;
}

button:hover {
  opacity: 1;
  background:rgba(225,225,225,0.9);
  cursor: pointer;
}

A src/img/19.png => src/img/19.png +0 -0
A src/img/20.png => src/img/20.png +0 -0
A src/img/30.png => src/img/30.png +0 -0
A src/img/35.png => src/img/35.png +0 -0
A src/img/38.png => src/img/38.png +0 -0
A src/img/40.png => src/img/40.png +0 -0
A src/img/48.png => src/img/48.png +0 -0
A src/img/96.png => src/img/96.png +0 -0
A src/install.html => src/install.html +25 -0
@@ 0,0 1,25 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="install_title"></title>
    <link rel="stylesheet" href="css/awsm.css"/>
  </head>
  <body>
    <header>
      <h1 data-i18n="install_title"></h1>
    </header>
    <main>
      <article>
        <section>
          <p>...</p>
        </section>
      </article>
    </main>
    <footer>
      <p>&copy; <span class="current-year"></span> Harmless Systems</p>
    </footer>
    <script src="js/global.js"></script>
    <script src="js/i18n.js"></script>
  </body>
</html>
\ No newline at end of file

A src/js/background.js => src/js/background.js +17 -0
@@ 0,0 1,17 @@
browser.runtime.onInstalled.addListener((details) => {
  switch (details.reason) {
    case 'install': 
      browser.tabs.create({
        url: browser.runtime.getURL('install.html')
      });
    break;
    case 'update':
      browser.tabs.create({
        url: browser.runtime.getURL('release.html')
      });
    break;
    default:
      console.log('browser.runtime.onInstalled', details);
    break;
  }
});
\ No newline at end of file

A src/js/backgroundScriptsAPIBridge.js => src/js/backgroundScriptsAPIBridge.js +1072 -0
@@ 0,0 1,1072 @@
// This file is required for Edge and included by Microsoft Edge Extension Toolkit
try {
    if (!Range.prototype.hasOwnProperty("intersectsNode")) {
        Range.prototype["intersectsNode"] = function (node) {
            let range = document.createRange();
            range.selectNode(node);
            return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
                && 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
        };
    }
}
catch (e) { }
try {
    if (!Navigator.prototype.hasOwnProperty("languages")) {
        Navigator.prototype["languages"] = [navigator.language];
    }
}
catch (e) { }
var getExtensionProtocol = function () {
    if (typeof browser == "undefined") {
        if (typeof chrome !== "undefined")
            return "chrome-extension://";
    }
    else {
        return "ms-browser-extension://";
    }
};
class BridgeAlarmEvent {
    constructor() {
        this.listeners = new Array();
    }
    addListener(callback) {
        this.listeners.push(callback);
    }
    addRules(rules, callback) { }
    getRules(ruleIdentifiers, callback) { }
    hasListener(callback) { return false; }
    hasListeners() { return this.listeners.length > 0; }
    removeRules(ruleIdentifiers, callback) { }
    removeListener(callback) { }
}
class EdgeBridgeAlarms {
    constructor() {
        this.alarms = {};
        this.onAlarm = new BridgeAlarmEvent();
    }
    create(name, alarmInfo) {
        if (arguments.length < 1 || arguments.length > 2) {
            throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)";
        }
        var alarmName = "";
        var startMilliseconds = 0;
        var startSet = false;
        if (typeof name === "string") {
            alarmName = name;
        }
        else if (typeof name === "object") {
            alarmInfo = name;
        }
        else
            throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)";
        if (!alarmInfo) {
            throw "You must specify an alarmInfo argument!!";
        }
        if (!alarmInfo.when && !alarmInfo.delayInMinutes && !alarmInfo.periodInMinutes) {
            throw "Invalid alarmInfo argument!!";
        }
        else if (alarmInfo.when && alarmInfo.delayInMinutes) {
            throw "Invalid alarmInfo argument!! Either 'when' or 'delayInMinutes' but not both!!";
        }
        else if (alarmInfo.when) {
            startMilliseconds = alarmInfo.when;
            startSet = true;
        }
        else if (alarmInfo.delayInMinutes) {
            startMilliseconds = alarmInfo.delayInMinutes * 60 * 1000;
            startSet = true;
        }
        else if (alarmInfo.periodInMinutes) {
            startMilliseconds = alarmInfo.periodInMinutes * 60 * 1000;
            startSet = true;
        }
        else
            throw "Invalid alarmInfo argument!!";
        var timerHandle;
        if (startSet) {
            if (this.alarms[alarmName]) {
                this.clearAlarm(alarmName);
            }
            var alarm = { name: alarmName, scheduledTime: Date.now() + startMilliseconds };
            var alarmAndHandle = { alarm: alarm, timerHandle: 0, startedInterval: false };
            this.alarms[alarmName] = alarmAndHandle;
            if (alarmInfo.periodInMinutes) {
                this.alarms[alarmName].alarm.periodInMinutes = alarmInfo.periodInMinutes;
                this.alarms[alarmName].timerHandle = window.setTimeout(function (alarmName, that) {
                    that.soundAlarm(alarmName, that);
                    that.alarms[alarmName].timerHandle = window.setInterval(that.soundAlarm, alarmInfo.periodInMinutes * 60 * 1000, alarmName, that);
                    that.alarms[alarmName].startedInterval = true;
                }, startMilliseconds, alarmName, this);
            }
            else {
                this.alarms[alarmName].timerHandle = window.setTimeout(this.soundAlarm, startMilliseconds, alarmName, this);
            }
        }
    }
    getAll(callback) {
        for (var key in this.alarms) {
            if (this.alarms.hasOwnProperty(key)) {
                var alarm = this.alarms[key].alarm;
                callback(alarm);
            }
        }
    }
    clearAll(callback) {
        var clearedAll = true;
        for (var key in this.alarms) {
            if (this.alarms.hasOwnProperty(key)) {
                var alarm = this.alarms[key].alarm;
                if (!this.clearAlarm(alarm.name)) {
                    clearedAll = false;
                }
            }
        }
        if (callback) {
            callback(clearedAll);
        }
    }
    clear(name, callback) {
        var alarmName = "";
        if (typeof name === "string") {
            alarmName = name;
        }
        else if (typeof name === "function") {
            callback = name;
        }
        var wasCleared = this.clearAlarm(alarmName);
        if (callback) {
            callback(wasCleared);
        }
    }
    get(name, callback) {
        if (this.alarms.hasOwnProperty(name)) {
            var alarm = this.alarms[name].alarm;
            callback(alarm);
        }
    }
    clearAlarm(name) {
        var wasCleared = false;
        if (this.alarms[name]) {
            if (this.alarms[name].alarm.startedInterval) {
                window.clearInterval(this.alarms[name].timerHandle);
            }
            else {
                window.clearTimeout(this.alarms[name].timerHandle);
            }
            delete this.alarms[name];
            wasCleared = true;
        }
        return wasCleared;
    }
    soundAlarm(name, that) {
        for (var index = 0; index < that.onAlarm.listeners.length; index++) {
            var listener = that.onAlarm.listeners[index];
            listener({ name: name });
        }
    }
}
class FakeEvent {
    addListener(callback) { }
    addRules(rules, callback) { }
    getRules(ruleIdentifiers, callback) { }
    hasListener(callback) { return false; }
    hasListeners() { return false; }
    removeRules(ruleIdentifiers, callback) { }
    removeListener(callback) { }
}
class EdgeBridgeHelper {
    constructor() {
        this.fakeEvent = new FakeEvent();
        this.alarms = new EdgeBridgeAlarms();
    }
    toAbsolutePath(relativePath) {
        if (relativePath.indexOf("ms-browser-extension://") == 0) {
            return relativePath.replace(myBrowser.runtime.getURL(""), "");
        }
        else if (relativePath.indexOf("/") != 0) {
            var absolutePath = "";
            var documentPath = document.location.pathname;
            absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
            absolutePath += relativePath;
            return absolutePath;
        }
        return relativePath;
    }
}
var bridgeHelper = new EdgeBridgeHelper();
class EdgeBridgeDebugLog {
    constructor() {
        this.CatchOnException = true;
        this.VerboseLogging = true;
        this.FailedCalls = {};
        this.SuccededCalls = {};
        this.DeprecatedCalls = {};
        this.BridgedCalls = {};
        this.UnavailableApis = {};
        this.EdgeIssues = {};
    }
    log(message) {
        try {
            if (this.VerboseLogging) {
                console.log(message);
            }
        }
        catch (e) {
        }
    }
    info(message) {
        try {
            if (this.VerboseLogging) {
                console.info(message);
            }
        }
        catch (e) {
        }
    }
    warn(message) {
        try {
            if (this.VerboseLogging) {
                console.warn(message);
            }
        }
        catch (e) {
        }
    }
    error(message) {
        try {
            if (this.VerboseLogging) {
                console.error(message);
            }
        }
        catch (e) {
        }
    }
    DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
        var result;
        try {
            result = action();
            this.AddToCalledDictionary(this.SuccededCalls, name);
            if (typeof deprecatedTo !== "undefined") {
                this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
                this.AddToCalledDictionary(this.DeprecatedCalls, name);
            }
            if (typeof bridgedTo !== "undefined") {
                this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
                this.AddToCalledDictionary(this.BridgedCalls, name);
            }
            this.info("API Call: '" + name + "'");
            return result;
        }
        catch (ex) {
            this.AddToCalledDictionary(this.FailedCalls, name);
            if (this.CatchOnException)
                this.error("API Call Failed: " + name + " - " + ex);
            else
                throw ex;
        }
    }
    LogEdgeIssue(name, message) {
        this.warn(message);
        this.AddToCalledDictionary(this.EdgeIssues, name);
    }
    LogUnavailbleApi(name, deprecatedTo) {
        this.warn("API Call '" + name + "' is not supported in Edge");
        this.AddToCalledDictionary(this.UnavailableApis, name);
        if (typeof deprecatedTo !== "undefined") {
            this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
            this.AddToCalledDictionary(this.DeprecatedCalls, name);
        }
    }
    AddToCalledDictionary(dictionary, name) {
        if (typeof dictionary[name] !== "undefined") {
            dictionary[name]++;
        }
        else {
            dictionary[name] = 1;
        }
    }
}
var bridgeLog = new EdgeBridgeDebugLog();
class EdgeChromeAlarmBridge {
    get onAlarm() {
        return bridgeLog.DoActionAndLog(() => {
            return bridgeHelper.alarms.onAlarm;
        }, "alarms.onAlarm", undefined, "bridgeHelper.alarms.onAlarm");
    }
    create(name, alarmInfo) {
        bridgeLog.DoActionAndLog(() => {
            bridgeHelper.alarms.create.apply(bridgeHelper.alarms, arguments);
        }, "alarms.create", undefined, "bridgeHelper.alarms.create");
    }
    getAll(callback) {
        bridgeLog.DoActionAndLog(() => {
            bridgeHelper.alarms.getAll.apply(bridgeHelper.alarms, arguments);
        }, "alarms.getAll", undefined, "bridgeHelper.alarms.getAll");
    }
    clearAll(callback) {
        bridgeLog.DoActionAndLog(() => {
            bridgeHelper.alarms.clearAll.apply(bridgeHelper.alarms, arguments);
        }, "alarms.clearAll", undefined, "bridgeHelper.alarms.clearAll");
    }
    clear(name, callback) {
        bridgeLog.DoActionAndLog(() => {
            bridgeHelper.alarms.clear.apply(bridgeHelper.alarms, arguments);
        }, "alarms.clear", undefined, "bridgeHelper.alarms.clear");
    }
    get(name, callback) {
        bridgeLog.DoActionAndLog(() => {
            bridgeHelper.alarms.get.apply(bridgeHelper.alarms, arguments);
        }, "alarms.get", undefined, "bridgeHelper.alarms.get");
    }
}
class EdgeChromeAppBridge {
    getDetails() {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeChromeRuntimeBridge.prototype.getManifest.apply(null, arguments);
        }, "app.getManifest", undefined, "runtime.getManifest");
    }
    get isInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.isInstalled is not available in Edge"; }, "app.isInstalled"); }
    getIsInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.getIsInstalled is not available in the Edge"; }, "app.getIsInstalled"); }
    installState() { return bridgeLog.DoActionAndLog(() => { throw "app.installState is not available in Edge"; }, "app.installState"); }
    runningState() { return bridgeLog.DoActionAndLog(() => { throw "app.runningState is not available in Edge"; }, "app.runningState"); }
}
class EdgeBookmarksBridge {
    create(bookmark, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.create.apply(null, arguments);
        }, "bookmarks.create");
    }
    getTree(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.getTree.apply(null, arguments);
        }, "bookmarks.getTree");
    }
    move(id, destination, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.move.apply(null, arguments);
        }, "bookmarks.move");
    }
    remove(id, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.remove.apply(null, arguments);
        }, "bookmarks.remove");
    }
    removeTree(id, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.removeTree.apply(null, arguments);
        }, "bookmarks.removeTree");
    }
    update(id, changes, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.bookmarks.update.apply(null, arguments);
        }, "bookmarks.update");
    }
}
class EdgeChromeBookmarksBridge extends EdgeBookmarksBridge {
    get onRemoved() { bridgeLog.LogUnavailbleApi("bookmarks.onRemoved"); return bridgeHelper.fakeEvent; }
    get onImportEnded() { bridgeLog.LogUnavailbleApi("bookmarks.onImportEnded"); return bridgeHelper.fakeEvent; }
    get onImportBegan() { bridgeLog.LogUnavailbleApi("bookmarks.onImportBegan"); return bridgeHelper.fakeEvent; }
    get onChanged() { bridgeLog.LogUnavailbleApi("bookmarks.onChanged"); return bridgeHelper.fakeEvent; }
    get onMoved() { bridgeLog.LogUnavailbleApi("bookmarks.onMoved"); return bridgeHelper.fakeEvent; }
    get onCreated() { bridgeLog.LogUnavailbleApi("bookmarks.onCreated"); return bridgeHelper.fakeEvent; }
    get onChildrenReordered() { bridgeLog.LogUnavailbleApi("bookmarks.onChildrenReordered"); return bridgeHelper.fakeEvent; }
    getRecent(numberOfItems, callback) {
        bridgeLog.LogUnavailbleApi("bookmarks.getRecent");
    }
    get(idList, callback) {
        bridgeLog.LogUnavailbleApi("bookmarks.get");
    }
    getChildren(id, callback) {
        bridgeLog.LogUnavailbleApi("bookmarks.getChildren");
    }
    getSubTree(id, callback) {
        bridgeLog.LogUnavailbleApi("bookmarks.getSubTree");
    }
    search(query, callback) {
        bridgeLog.LogUnavailbleApi("bookmarks.search");
    }
}
class EdgeBrowserActionBridge {
    get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.browserAction.onClicked; }, "browserAction.onClicked"); }
    disable(tabId) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.disable.apply(null, arguments);
        }, "browserAction.disable");
    }
    enable(tabId) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.enable.apply(null, arguments);
        }, "browserAction.Enable");
    }
    getBadgeBackgroundColor(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.getBadgeBackgroundColor.apply(null, arguments);
        }, "browserAction.getBadgeBackgroundColor");
    }
    getBadgeText(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.getBadgeText.apply(null, arguments);
            ;
        }, "browserAction.getBadgeText");
    }
    getPopup(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.getPopup.apply(null, arguments);
        }, "browserAction.getPopup");
    }
    getTitle(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.getTitle.apply(null, arguments);
        }, "browserAction.getTitle");
    }
    setBadgeBackgroundColor(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.setBadgeBackgroundColor.apply(null, arguments);
        }, "browserAction.setBadgeBackgroundColor");
    }
    setBadgeText(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.setBadgeText.apply(null, arguments);
        }, "browserAction.setBadgeText");
    }
    setIcon(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.setIcon.apply(null, arguments);
        }, "browserAction.setIcon");
    }
    setPopup(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.setPopup.apply(null, arguments);
        }, "browserAction.setPopup");
    }
    setTitle(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.browserAction.setTitle.apply(null, arguments);
        }, "browserAction.setTitle");
    }
}
class EdgeChromeBrowserActionBridge extends EdgeBrowserActionBridge {
    getPopup(details, callback) {
        if (myBrowser.browserAction.getPopup) {
            EdgeBrowserActionBridge.prototype.getPopup.apply(null, arguments);
        }
        else {
            bridgeLog.LogUnavailbleApi("browserAction.getPopup");
        }
    }
    getTitle(details, callback) {
        if (myBrowser.browserAction.getTitle) {
            EdgeBrowserActionBridge.prototype.getTitle.apply(null, arguments);
        }
        else {
            bridgeLog.LogUnavailbleApi("browserAction.getTitle");
        }
    }
    setTitle(details) {
        if (myBrowser.browserAction.setTitle) {
            EdgeBrowserActionBridge.prototype.setTitle.apply(null, arguments);
        }
        else {
            bridgeLog.LogUnavailbleApi("browserAction.setTitle");
        }
    }
}
class EdgeChromeCommandsBridge {
    get onCommand() { bridgeLog.LogUnavailbleApi("commands.onCommand"); return bridgeHelper.fakeEvent; }
    getAll(callback) {
        bridgeLog.LogUnavailbleApi("commands.getAll");
    }
}
class EdgeContextMenusBridge {
    get ACTION_MENU_TOP_LEVEL_LIMIT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT; }, "contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT"); }
    get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.onClicked; }, "contextMenus.onClicked"); }
    create(createProperties, callback) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.contextMenus.create.apply(null, arguments);
        }, "contextMenus.create");
    }
    remove(menuItemId, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.contextMenus.remove.apply(null, arguments);
        }, "contextMenus.remove");
    }
    removeAll(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.contextMenus.removeAll.apply(null, arguments);
        }, "contextMenus.removeAll");
    }
    update(id, updateProperties, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.contextMenus.update.apply(null, arguments);
        }, "contextMenus.update");
    }
}
class EdgeCookiesBridge {
    get(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.cookies.get.apply(null, arguments);
        }, "cookies.get");
    }
    getAll(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.cookies.getAll.apply(null, arguments);
        }, "cookies.getAll");
    }
    remove(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.cookies.remove.apply(null, arguments);
        }, "cookies.remove");
    }
    set(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.cookies.set.apply(null, arguments);
        }, "cookies.set");
    }
}
class EdgeChromeCookiesBridge extends EdgeCookiesBridge {
    get onChanged() { bridgeLog.LogUnavailbleApi("cookies.onChanged"); return bridgeHelper.fakeEvent; }
}
class EdgeExtensionBridge {
    get inIncognitoContext() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.inIncognitoContext;
        }, "extension.inIncognitoContext");
    }
    getBackgroundPage() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getBackgroundPage.apply(null, arguments);
        }, "extension.getBackgroundPage");
    }
    getURL(path) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getURL.apply(null, arguments);
        }, "extension.getURL");
    }
    getViews(fetchProperties) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getViews.apply(null, arguments);
        }, "extension.getViews");
    }
    isAllowedIncognitoAccess(callback) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.isAllowedIncognitoAccess.apply(null, arguments);
        }, "extension.isAllowedIncognitoAccess");
    }
}
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
    get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
    get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
    get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
    get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
    get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
    connect(extensionId, connectInfo) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.connect.apply(null, arguments);
        }, "extension.connect", "runtime.connect", "runtime.connect");
    }
    sendMessage(message, responseCallback) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments);
        }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
    }
    sendRequest(extensionId, message, options, responseCallback) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments);
        }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
    }
    isAllowedFileSchemeAccess(callback) {
        bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
    }
    setUpdateUrlData(data) {
        bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
    }
}
class EdgeHistoryBridge {
    get onVisited() { bridgeLog.LogUnavailbleApi("history.onVisited"); return bridgeHelper.fakeEvent; }
    get onVisitRemoved() { bridgeLog.LogUnavailbleApi("history.onVisitRemoved"); return bridgeHelper.fakeEvent; }
    addUrl(details, callback) {
        bridgeLog.LogUnavailbleApi("history.addUrl");
    }
    deleteAll(callback) {
        bridgeLog.LogUnavailbleApi("history.deleteAll");
    }
    deleteRange(range, callback) {
        bridgeLog.LogUnavailbleApi("history.deleteRange");
    }
    deleteUrl(details, callback) {
        bridgeLog.LogUnavailbleApi("history.deleteUrl");
    }
    getVisits(details, callback) {
        bridgeLog.LogUnavailbleApi("history.getVisits");
    }
    search(query, callback) {
        bridgeLog.LogUnavailbleApi("history.search");
    }
}
class EdgeI18nBridge {
    getAcceptLanguages(callback) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.i18n.getAcceptLanguages.apply(null, arguments);
        }, "i18n.getAcceptLanguages");
    }
    getMessage(messageName, substitutions) {
        return bridgeLog.DoActionAndLog(() => {
            if (messageName.indexOf("@@extension_id") > -1) {
                return myBrowser.runtime.id;
            }
            return myBrowser.i18n.getMessage.apply(null, arguments);
        }, "i18n.getMessage");
    }
    getUILanguage() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.i18n.getUILanguage.apply(null, arguments);
        }, "i18n.getUILanguage");
    }
}
class EdgeChromeIdleBridge {
    get onStateChanged() { bridgeLog.LogUnavailbleApi("idle.onStateChanged"); return bridgeHelper.fakeEvent; }
    queryState(detectionIntervalInSeconds, callback) {
        bridgeLog.LogUnavailbleApi("idle.queryState");
    }
    setDetectionInterval(intervalInSeconds) {
        bridgeLog.LogUnavailbleApi("idle.setDetectionInterval");
    }
}
class EdgeNotificationBridge {
    get onButtonClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onButtonClicked; }, "notifications.onButtonClicked"); }
    get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onClicked; }, "notifications.onClicked"); }
    get onClosed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onClosed; }, "notifications.onClosed"); }
    get onPermissionLevelChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onPermissionLevelChanged; }, "notifications.onPermissionLevelChanged"); }
    get onShowSettings() { bridgeLog.LogUnavailbleApi("notifications.onShowSettings"); return bridgeHelper.fakeEvent; }
    clear(notificationId, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.notifications.clear.apply(null, arguments);
        }, "notifications.clear");
    }
    create(notificationId, options, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.notifications.create.apply(null, arguments);
        }, "notifications.create");
    }
    getAll(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.notifications.getAll.apply(null, arguments);
        }, "notifications.getAll");
    }
    getPermissionLevel(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.notifications.getPermissionLevel.apply(null, arguments);
        }, "notifications.getPermissionLevel");
    }
    update(notificationId, options, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.notifications.update.apply(null, arguments);
        }, "notifications.update");
    }
}
class EdgePageActionBridge {
    get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.pageAction.onClicked; }, "pageAction.onClicked"); }
    getPopup(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.getPopup.apply(null, arguments);
        }, "pageAction.getPopup");
    }
    getTitle(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.getTitle.apply(null, arguments);
        }, "pageAction.getTitle");
    }
    hide(tabId) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.hide.apply(null, arguments);
        }, "pageAction.hide");
    }
    setTitle(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.setTitle.apply(null, arguments);
        }, "pageAction.setTitle");
    }
    setIcon(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.setIcon.apply(null, arguments);
        }, "pageAction.setIcon");
    }
    setPopup(details) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.setPopup.apply(null, arguments);
        }, "pageAction.setPopup");
    }
    show(tabId) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.pageAction.show.apply(null, arguments);
        }, "pageAction.show");
    }
}
class EdgePermissionsBridge {
    get onAdded() { bridgeLog.LogUnavailbleApi("permissions.onAdded"); return bridgeHelper.fakeEvent; }
    get onRemoved() { bridgeLog.LogUnavailbleApi("permissions.onRemoved"); return bridgeHelper.fakeEvent; }
    contains(permissions, callback) {
        bridgeLog.LogUnavailbleApi("permissions.contains");
    }
    getAll(callback) {
        bridgeLog.LogUnavailbleApi("permissions.getAll");
    }
    remove(permissions, callback) {
        bridgeLog.LogUnavailbleApi("permissions.remove");
    }
    request(permissions, callback) {
        bridgeLog.LogUnavailbleApi("permissions.request");
    }
}
class EdgeRuntimeBridge {
    get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
    get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
    get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
    get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
    get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
    get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
    connect(extensionId, connectInfo) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.connect.apply(null, arguments);
        }, "runtime.connect");
    }
    connectNative(application) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.connectNative.apply(null, arguments);
        }, "runtime.connectNative");
    }
    getBackgroundPage(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.getBackgroundPage.apply(null, arguments);
        }, "runtime.getBackgroundPage");
    }
    getManifest() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.getManifest.apply(null, arguments);
        }, "runtime.getManifest");
    }
    getURL(path) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.getURL.apply(null, arguments);
        }, "runtime.getURL");
    }
    reload() {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.reload.apply(null, arguments);
        }, "runtime.reload");
    }
    sendMessage(extensionId, message, options, responseCallback) {
        if (arguments.length === 4) {
            Array.prototype.splice.apply(arguments, [2, 1]);
        }
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.sendMessage.apply(null, arguments);
        }, "runtime.sendMessage");
    }
    sendNativeMessage(application, message, responseCallback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.sendNativeMessage.apply(null, arguments);
        }, "runtime.sendNativeMessage");
    }
    setUninstallURL(url, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.setUninstallURL.apply(null, arguments);
        }, "runtime.setUninstallURL");
    }
}
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
    get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
    get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
    get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
    get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
    get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
    get onStartup() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "runtime.onStartup", undefined, "windows.onCreated"); }
    openOptionsPage(callback) {
        bridgeLog.DoActionAndLog(() => {
            var optionsPage = myBrowser.runtime.getManifest()["options_page"];
            var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
            if (typeof callback !== "undefined") {
                myBrowser.tabs.create({ url: optionsPageUrl }, callback);
            }
            else {
                myBrowser.tabs.create({ url: optionsPageUrl });
            }
        }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
    }
    setUninstallURL(url, callback) {
        if (myBrowser.runtime.setUninstallURL) {
            EdgeRuntimeBridge.prototype.setUninstallURL.apply(null, arguments);
        }
        else {
            bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
        }
    }
    getPackageDirectoryEntry(callback) {
        bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
    }
    getPlatformInfo(callback) {
        bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
    }
    requestUpdateCheck(callback) {
        bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
    }
    restart() {
        bridgeLog.LogUnavailbleApi("runtime.restart");
    }
}
class EdgeStorageBridge {
    get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
    get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.sync; }, "storage.sync"); }
    get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
}
class EdgeChromeStorageBridge extends EdgeStorageBridge {
    get sync() {
        if (myBrowser.storage.sync) {
            return EdgeStorageBridge.prototype.sync;
        }
        else {
            return bridgeLog.DoActionAndLog(() => {
                return myBrowser.storage.local;
            }, "storage.sync", undefined, "storage.local");
        }
    }
    get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
}
class EdgeTabsBridge {
    get onActivated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onActivated; }, "tabs.onActivated"); }
    get onAttached() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onAttached; }, "tabs.onAttached"); }
    get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onCreated; }, "tabs.onCreated"); }
    get onDetached() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onDetached; }, "tabs.onDetached"); }
    get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onRemoved; }, "tabs.onRemoved"); }
    get onReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onReplaced; }, "tabs.onReplaced"); }
    get onUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onUpdated; }, "tabs.onUpdated"); }
    captureVisibleTab(windowId, options, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.captureVisibleTab.apply(null, arguments);
        }, "tabs.captureVisibleTab");
    }
    create(createProperties, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.create.apply(null, arguments);
        }, "tabs.create");
    }
    detectLanguage(tabId, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.detectLanguage.apply(null, arguments);
        }, "tabs.detectLanguage");
    }
    executeScript(tabId, details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.executeScript.apply(null, arguments);
        }, "tabs.executeScript");
    }
    get(tabId, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.get.apply(null, arguments);
        }, "tabs.get");
    }
    getCurrent(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.getCurrent.apply(null, arguments);
        }, "tabs.getCurrent");
    }
    insertCSS(tabId, details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.insertCSS.apply(null, arguments);
        }, "tabs.insertCSS");
    }
    query(queryInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.query.apply(null, arguments);
        }, "tabs.query");
    }
    reload(tabId, reloadProperties, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.reload.apply(null, arguments);
        }, "tabs.reload");
    }
    remove(tabId, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.remove.apply(null, arguments);
        }, "tabs.remove");
    }
    sendMessage(tabId, message, responseCallback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.sendMessage.apply(null, arguments);
        }, "tabs.sendMessage");
    }
    update(tabId, updateProperties, callback) {
        var updatePropertiesBridged = false;
        for (var index = 0; index < arguments.length; index++) {
            var argument = arguments[index];
            if (typeof argument === "object") {
                if (!argument.active && (argument.highlighted || argument.selected)) {
                    argument.active = argument.highlighted || argument.selected;
                    updatePropertiesBridged = true;
                }
            }
        }
        bridgeLog.DoActionAndLog(() => {
            myBrowser.tabs.update.apply(null, arguments);
        }, "tabs.update", undefined, updatePropertiesBridged ? "tabs.update with UpdateProperties modified" : undefined);
    }
}
class EdgeChromeTabsBridge extends EdgeTabsBridge {
    get onHighlighted() { bridgeLog.LogUnavailbleApi("tabs.onHighlighted"); return bridgeHelper.fakeEvent; }
    get onMoved() { bridgeLog.LogUnavailbleApi("tabs.onMoved"); return bridgeHelper.fakeEvent; }
    get onSelectionChanged() {
        return bridgeLog.DoActionAndLog(() => {
            var fakeEvent = bridgeHelper.fakeEvent;
            fakeEvent.addListener = (callback) => {
                myBrowser.tabs.onActivated.addListener((activeInfo) => {
                    callback(activeInfo.tabId, { windowId: activeInfo.windowId });
                });
            };
            return fakeEvent;
        }, "tabs.onSelectionChanged", "tabs.onActivated", "tabs.onActivated");
    }
    duplicate(tabId, callback) {
        bridgeLog.DoActionAndLog(() => {
            var tabGetCallback = function (tab) {
                if (typeof callback !== "undefined") {
                    myBrowser.tabs.create({ url: tab.url }, callback);
                }
                else {
                    myBrowser.tabs.create({ url: tab.url });
                }
            };
            EdgeTabsBridge.prototype.get(tabId, tabGetCallback);
        }, "tabs.duplicate", undefined, "tabs.create");
    }
    getAllInWindow(windowId, callback) {
        bridgeLog.DoActionAndLog(() => {
            EdgeTabsBridge.prototype.query({ windowId: windowId }, callback);
        }, "tabs.getAllInWindow", "tabs.query", "tabs.query");
    }
    getSelected(windowId, callback) {
        bridgeLog.DoActionAndLog(() => {
            EdgeTabsBridge.prototype.query({ active: true }, (tabs) => callback(tabs[0]));
        }, "tabs.getSelected", "tabs.query", "tabs.query");
    }
    sendRequest(tabId, request, responseCallback) {
        bridgeLog.DoActionAndLog(() => {
            EdgeTabsBridge.prototype.sendMessage.apply(null, arguments);
        }, "tabs.sendRequest", "tabs.sendMessage", "tabs.sendMessage");
    }
    connect(tabId, connectInfo) {
        bridgeLog.LogUnavailbleApi("tabs.connect");
        return null;
    }
    highlight(highlightInfo, callback) {
        bridgeLog.LogUnavailbleApi("tabs.highlight");
    }
    move(tabId, moveProperties, callback) {
        bridgeLog.LogUnavailbleApi("tabs.move");
    }
}
class EdgeWebNavigationBridge {
    get onBeforeNavigate() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onBeforeNavigate; }, "webNavigation.onBeforeNavigate"); }
    get onCommitted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCommitted; }, "webNavigation.onCommitted"); }
    get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCompleted; }, "webNavigation.onCompleted"); }
    get onCreatedNavigationTarget() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCreatedNavigationTarget; }, "webNavigation.onCreatedNavigationTarget"); }
    get onDOMContentLoaded() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onDOMContentLoaded; }, "webNavigation.onDOMContentLoaded"); }
    get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onErrorOccurred; }, "webNavigation.onErrorOccurred"); }
    get onHistoryStateUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onHistoryStateUpdated; }, "webNavigation.onHistoryStateUpdated"); }
    get onReferenceFragmentUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onReferenceFragmentUpdated; }, "webNavigation.onReferenceFragmentUpdated"); }
    get onTabReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onTabReplaced; }, "webNavigation.onTabReplaced"); }
    getAllFrames(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.webNavigation.getAllFrames.apply(null, arguments);
        }, "webNavigation.getAllFrames");
    }
    getFrame(details, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.webNavigation.getFrame.apply(null, arguments);
        }, "webNavigation.getFrame");
    }
}
class EdgeWebRequestBridge {
    get MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; }, "webNavigation.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES"); }
    get onAuthRequired() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onAuthRequired; }, "webRequest.onAuthRequired"); }
    get onBeforeRedirect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRedirect; }, "webRequest.onBeforeRedirect"); }
    get onBeforeRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRequest; }, "webRequest.onBeforeRequest"); }
    get onBeforeSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeSendHeaders; }, "webRequest.onBeforeSendHeaders"); }
    get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onCompleted; }, "webRequest.onCompleted"); }
    get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onErrorOccurred; }, "webRequest.onErrorOccurred"); }
    get onHeadersReceived() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onHeadersReceived; }, "webRequest.onHeadersReceived"); }
    get onResponseStarted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onResponseStarted; }, "webRequest.onResponseStarted"); }
    get onSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onSendHeaders; }, "webRequest.onSendHeaders"); }
    handlerBehaviorChanged(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.webRequest.handlerBehaviorChanged.apply(null, arguments);
        }, "webRequest.handlerBehaviorChanged");
    }
}
class EdgeWindowsBridge {
    get WINDOW_ID_CURRENT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_CURRENT; }, "windows.WINDOW_ID_CURRENT"); }
    get WINDOW_ID_NONE() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_NONE; }, "windows.WINDOW_ID_NONE"); }
    get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "windows.onCreated"); }
    get onFocusChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onFocusChanged; }, "windows.onFocusChanged"); }
    get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onRemoved; }, "windows.onRemoved"); }
    create(createData, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.create.apply(null, arguments);
        }, "windows.create");
    }
    get(windowId, getInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.get.apply(null, arguments);
        }, "windows.get");
    }
    getAll(getInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.getAll.apply(null, arguments);
        }, "windows.getAll");
    }
    getCurrent(getInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.getCurrent.apply(null, arguments);
        }, "windows.getCurrent");
    }
    getLastFocused(getInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.getLastFocused.apply(null, arguments);
        }, "windows.getLastFocused");
    }
    update(windowId, updateInfo, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.windows.update.apply(null, arguments);
        }, "windows.update");
    }
}
class EdgeChromeWindowsBridge extends EdgeWindowsBridge {
    remove(windowId, callback) {
        bridgeLog.LogUnavailbleApi("windows.remove");
    }
}
class EdgeBackgroundBridge {
    constructor() {
        this.alarms = new EdgeChromeAlarmBridge();
        this.app = new EdgeChromeAppBridge();
        this.commands = new EdgeChromeCommandsBridge();
        this.idle = new EdgeChromeIdleBridge();
        this.notifications = new EdgeNotificationBridge();
        this.bookmarks = typeof browser["bookmarks"] !== "undefined" ? new EdgeChromeBookmarksBridge() : undefined;
        this.browserAction = typeof browser.browserAction !== "undefined" ? new EdgeChromeBrowserActionBridge() : undefined;
        this.contextMenus = typeof browser.contextMenus !== "undefined" ? new EdgeContextMenusBridge() : undefined;
        this.cookies = typeof browser.cookies !== "undefined" ? new EdgeChromeCookiesBridge() : undefined;
        this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
        this.history = typeof browser.history !== "undefined" ? new EdgeHistoryBridge() : undefined;
        this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
        this.pageAction = typeof browser.pageAction !== "undefined" ? new EdgePageActionBridge() : undefined;
        this.permissions = typeof browser.permissions !== "undefined" ? new EdgePermissionsBridge() : undefined;
        this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
        this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
        this.tabs = typeof browser.tabs !== "undefined" ? new EdgeChromeTabsBridge() : undefined;
        this.webNavigation = typeof browser.webNavigation !== "undefined" ? new EdgeWebNavigationBridge() : undefined;
        this.webRequest = typeof browser.webRequest !== "undefined" ? new EdgeWebRequestBridge() : undefined;
        this.windows = typeof browser.windows !== "undefined" ? new EdgeChromeWindowsBridge() : undefined;
    }
}
var myBrowser = browser;
var chrome = new EdgeBackgroundBridge();

A src/js/contentScriptsAPIBridge.js => src/js/contentScriptsAPIBridge.js +488 -0
@@ 0,0 1,488 @@
// This file is required for Edge and included by Microsoft Edge Extension Toolkit
try {
    if (!Range.prototype.hasOwnProperty("intersectsNode")) {
        Range.prototype["intersectsNode"] = function (node) {
            let range = document.createRange();
            range.selectNode(node);
            return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
                && 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
        };
    }
}
catch (e) { }
try {
    if (!Navigator.prototype.hasOwnProperty("languages")) {
        Navigator.prototype["languages"] = [navigator.language];
    }
}
catch (e) { }
var getExtensionProtocol = function () {
    if (typeof browser == "undefined") {
        if (typeof chrome !== "undefined")
            return "chrome-extension://";
    }
    else {
        return "ms-browser-extension://";
    }
};
class BridgeAlarmEvent {
    constructor() {
        this.listeners = new Array();
    }
    addListener(callback) {
        this.listeners.push(callback);
    }
    addRules(rules, callback) { }
    getRules(ruleIdentifiers, callback) { }
    hasListener(callback) { return false; }
    hasListeners() { return this.listeners.length > 0; }
    removeRules(ruleIdentifiers, callback) { }
    removeListener(callback) { }
}
class EdgeBridgeAlarms {
    constructor() {
        this.alarms = {};
        this.onAlarm = new BridgeAlarmEvent();
    }
    create(name, alarmInfo) {
        if (arguments.length < 1 || arguments.length > 2) {
            throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)";
        }
        var alarmName = "";
        var startMilliseconds = 0;
        var startSet = false;
        if (typeof name === "string") {
            alarmName = name;
        }
        else if (typeof name === "object") {
            alarmInfo = name;
        }
        else
            throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)";
        if (!alarmInfo) {
            throw "You must specify an alarmInfo argument!!";
        }
        if (!alarmInfo.when && !alarmInfo.delayInMinutes && !alarmInfo.periodInMinutes) {
            throw "Invalid alarmInfo argument!!";
        }
        else if (alarmInfo.when && alarmInfo.delayInMinutes) {
            throw "Invalid alarmInfo argument!! Either 'when' or 'delayInMinutes' but not both!!";
        }
        else if (alarmInfo.when) {
            startMilliseconds = alarmInfo.when;
            startSet = true;
        }
        else if (alarmInfo.delayInMinutes) {
            startMilliseconds = alarmInfo.delayInMinutes * 60 * 1000;
            startSet = true;
        }
        else if (alarmInfo.periodInMinutes) {
            startMilliseconds = alarmInfo.periodInMinutes * 60 * 1000;
            startSet = true;
        }
        else
            throw "Invalid alarmInfo argument!!";
        var timerHandle;
        if (startSet) {
            if (this.alarms[alarmName]) {
                this.clearAlarm(alarmName);
            }
            var alarm = { name: alarmName, scheduledTime: Date.now() + startMilliseconds };
            var alarmAndHandle = { alarm: alarm, timerHandle: 0, startedInterval: false };
            this.alarms[alarmName] = alarmAndHandle;
            if (alarmInfo.periodInMinutes) {
                this.alarms[alarmName].alarm.periodInMinutes = alarmInfo.periodInMinutes;
                this.alarms[alarmName].timerHandle = window.setTimeout(function (alarmName, that) {
                    that.soundAlarm(alarmName, that);
                    that.alarms[alarmName].timerHandle = window.setInterval(that.soundAlarm, alarmInfo.periodInMinutes * 60 * 1000, alarmName, that);
                    that.alarms[alarmName].startedInterval = true;
                }, startMilliseconds, alarmName, this);
            }
            else {
                this.alarms[alarmName].timerHandle = window.setTimeout(this.soundAlarm, startMilliseconds, alarmName, this);
            }
        }
    }
    getAll(callback) {
        for (var key in this.alarms) {
            if (this.alarms.hasOwnProperty(key)) {
                var alarm = this.alarms[key].alarm;
                callback(alarm);
            }
        }
    }
    clearAll(callback) {
        var clearedAll = true;
        for (var key in this.alarms) {
            if (this.alarms.hasOwnProperty(key)) {
                var alarm = this.alarms[key].alarm;
                if (!this.clearAlarm(alarm.name)) {
                    clearedAll = false;
                }
            }
        }
        if (callback) {
            callback(clearedAll);
        }
    }
    clear(name, callback) {
        var alarmName = "";
        if (typeof name === "string") {
            alarmName = name;
        }
        else if (typeof name === "function") {
            callback = name;
        }
        var wasCleared = this.clearAlarm(alarmName);
        if (callback) {
            callback(wasCleared);
        }
    }
    get(name, callback) {
        if (this.alarms.hasOwnProperty(name)) {
            var alarm = this.alarms[name].alarm;
            callback(alarm);
        }
    }
    clearAlarm(name) {
        var wasCleared = false;
        if (this.alarms[name]) {
            if (this.alarms[name].alarm.startedInterval) {
                window.clearInterval(this.alarms[name].timerHandle);
            }
            else {
                window.clearTimeout(this.alarms[name].timerHandle);
            }
            delete this.alarms[name];
            wasCleared = true;
        }
        return wasCleared;
    }
    soundAlarm(name, that) {
        for (var index = 0; index < that.onAlarm.listeners.length; index++) {
            var listener = that.onAlarm.listeners[index];
            listener({ name: name });
        }
    }
}
class FakeEvent {
    addListener(callback) { }
    addRules(rules, callback) { }
    getRules(ruleIdentifiers, callback) { }
    hasListener(callback) { return false; }
    hasListeners() { return false; }
    removeRules(ruleIdentifiers, callback) { }
    removeListener(callback) { }
}
class EdgeBridgeHelper {
    constructor() {
        this.fakeEvent = new FakeEvent();
        this.alarms = new EdgeBridgeAlarms();
    }
    toAbsolutePath(relativePath) {
        if (relativePath.indexOf("ms-browser-extension://") == 0) {
            return relativePath.replace(myBrowser.runtime.getURL(""), "");
        }
        else if (relativePath.indexOf("/") != 0) {
            var absolutePath = "";
            var documentPath = document.location.pathname;
            absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
            absolutePath += relativePath;
            return absolutePath;
        }
        return relativePath;
    }
}
var bridgeHelper = new EdgeBridgeHelper();
class EdgeBridgeDebugLog {
    constructor() {
        this.CatchOnException = true;
        this.VerboseLogging = true;
        this.FailedCalls = {};
        this.SuccededCalls = {};
        this.DeprecatedCalls = {};
        this.BridgedCalls = {};
        this.UnavailableApis = {};
        this.EdgeIssues = {};
    }
    log(message) {
        try {
            if (this.VerboseLogging) {
                console.log(message);
            }
        }
        catch (e) {
        }
    }
    info(message) {
        try {
            if (this.VerboseLogging) {
                console.info(message);
            }
        }
        catch (e) {
        }
    }
    warn(message) {
        try {
            if (this.VerboseLogging) {
                console.warn(message);
            }
        }
        catch (e) {
        }
    }
    error(message) {
        try {
            if (this.VerboseLogging) {
                console.error(message);
            }
        }
        catch (e) {
        }
    }
    DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
        var result;
        try {
            result = action();
            this.AddToCalledDictionary(this.SuccededCalls, name);
            if (typeof deprecatedTo !== "undefined") {
                this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
                this.AddToCalledDictionary(this.DeprecatedCalls, name);
            }
            if (typeof bridgedTo !== "undefined") {
                this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
                this.AddToCalledDictionary(this.BridgedCalls, name);
            }
            this.info("API Call: '" + name + "'");
            return result;
        }
        catch (ex) {
            this.AddToCalledDictionary(this.FailedCalls, name);
            if (this.CatchOnException)
                this.error("API Call Failed: " + name + " - " + ex);
            else
                throw ex;
        }
    }
    LogEdgeIssue(name, message) {
        this.warn(message);
        this.AddToCalledDictionary(this.EdgeIssues, name);
    }
    LogUnavailbleApi(name, deprecatedTo) {
        this.warn("API Call '" + name + "' is not supported in Edge");
        this.AddToCalledDictionary(this.UnavailableApis, name);
        if (typeof deprecatedTo !== "undefined") {
            this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
            this.AddToCalledDictionary(this.DeprecatedCalls, name);
        }
    }
    AddToCalledDictionary(dictionary, name) {
        if (typeof dictionary[name] !== "undefined") {
            dictionary[name]++;
        }
        else {
            dictionary[name] = 1;
        }
    }
}
var bridgeLog = new EdgeBridgeDebugLog();
class EdgeExtensionBridge {
    get inIncognitoContext() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.inIncognitoContext;
        }, "extension.inIncognitoContext");
    }
    getBackgroundPage() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getBackgroundPage.apply(null, arguments);
        }, "extension.getBackgroundPage");
    }
    getURL(path) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getURL.apply(null, arguments);
        }, "extension.getURL");
    }
    getViews(fetchProperties) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.getViews.apply(null, arguments);
        }, "extension.getViews");
    }
    isAllowedIncognitoAccess(callback) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.extension.isAllowedIncognitoAccess.apply(null, arguments);
        }, "extension.isAllowedIncognitoAccess");
    }
}
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
    get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
    get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
    get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
    get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
    get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
    connect(extensionId, connectInfo) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.connect.apply(null, arguments);
        }, "extension.connect", "runtime.connect", "runtime.connect");
    }
    sendMessage(message, responseCallback) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments);
        }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
    }
    sendRequest(extensionId, message, options, responseCallback) {
        return bridgeLog.DoActionAndLog(() => {
            return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments);
        }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
    }
    isAllowedFileSchemeAccess(callback) {
        bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
    }
    setUpdateUrlData(data) {
        bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
    }
}
class EdgeI18nBridge {
    getAcceptLanguages(callback) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.i18n.getAcceptLanguages.apply(null, arguments);
        }, "i18n.getAcceptLanguages");
    }
    getMessage(messageName, substitutions) {
        return bridgeLog.DoActionAndLog(() => {
            if (messageName.indexOf("@@extension_id") > -1) {
                return myBrowser.runtime.id;
            }
            return myBrowser.i18n.getMessage.apply(null, arguments);
        }, "i18n.getMessage");
    }
    getUILanguage() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.i18n.getUILanguage.apply(null, arguments);
        }, "i18n.getUILanguage");
    }
}
class EdgeRuntimeBridge {
    get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
    get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
    get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
    get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
    get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
    get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
    connect(extensionId, connectInfo) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.connect.apply(null, arguments);
        }, "runtime.connect");
    }
    connectNative(application) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.connectNative.apply(null, arguments);
        }, "runtime.connectNative");
    }
    getBackgroundPage(callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.getBackgroundPage.apply(null, arguments);
        }, "runtime.getBackgroundPage");
    }
    getManifest() {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.getManifest.apply(null, arguments);
        }, "runtime.getManifest");
    }
    getURL(path) {
        return bridgeLog.DoActionAndLog(() => {
            return myBrowser.runtime.getURL.apply(null, arguments);
        }, "runtime.getURL");
    }
    reload() {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.reload.apply(null, arguments);
        }, "runtime.reload");
    }
    sendMessage(extensionId, message, options, responseCallback) {
        if (arguments.length === 4) {
            Array.prototype.splice.apply(arguments, [2, 1]);
        }
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.sendMessage.apply(null, arguments);
        }, "runtime.sendMessage");
    }
    sendNativeMessage(application, message, responseCallback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.sendNativeMessage.apply(null, arguments);
        }, "runtime.sendNativeMessage");
    }
    setUninstallURL(url, callback) {
        bridgeLog.DoActionAndLog(() => {
            myBrowser.runtime.setUninstallURL.apply(null, arguments);
        }, "runtime.setUninstallURL");
    }
}
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
    get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
    get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
    get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
    get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
    get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
    get onStartup() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "runtime.onStartup", undefined, "windows.onCreated"); }
    openOptionsPage(callback) {
        bridgeLog.DoActionAndLog(() => {
            var optionsPage = myBrowser.runtime.getManifest()["options_page"];
            var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
            if (typeof callback !== "undefined") {
                myBrowser.tabs.create({ url: optionsPageUrl }, callback);
            }
            else {
                myBrowser.tabs.create({ url: optionsPageUrl });
            }
        }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
    }
    setUninstallURL(url, callback) {
        if (myBrowser.runtime.setUninstallURL) {
            EdgeRuntimeBridge.prototype.setUninstallURL.apply(null, arguments);
        }
        else {
            bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
        }
    }
    getPackageDirectoryEntry(callback) {
        bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
    }
    getPlatformInfo(callback) {
        bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
    }
    requestUpdateCheck(callback) {
        bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
    }
    restart() {
        bridgeLog.LogUnavailbleApi("runtime.restart");
    }
}
class EdgeStorageBridge {
    get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
    get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.sync; }, "storage.sync"); }
    get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
}
class EdgeChromeStorageBridge extends EdgeStorageBridge {
    get sync() {
        if (myBrowser.storage.sync) {
            return EdgeStorageBridge.prototype.sync;
        }
        else {
            return bridgeLog.DoActionAndLog(() => {
                return myBrowser.storage.local;
            }, "storage.sync", undefined, "storage.local");
        }
    }
    get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
}
class EdgeContentBridge {
    constructor() {
        this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
        this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
        this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
        this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
    }
}
var myBrowser = browser;
var chrome = new EdgeContentBridge();

A src/js/global.js => src/js/global.js +65 -0
@@ 0,0 1,65 @@
const defaultOptions = {
  display_mode: 'INLINE',
  check_humanstxt: 'ON',
  color_theme: 'AUTO',
  host_cache_ttl: '24H'
};

/* jshint unused: false */
function getOption(option) {
  const result = localStorage.getItem(option);
  if (result !== null) {
    return result;
  }
  return defaultOptions[option];
}

function i18n(msg) {
  return ((window.chrome && typeof window.chrome.i18n === 'object') ?
      chrome.i18n.getMessage(msg) : msg) || msg;
}

const i18nTag = {
  generic: (element) => {
    let content;
    if (element.dataset.i18n) {
      content = i18n(element.dataset.i18n);
    } else if (element.id) {
      content = i18n(element.id);
    }
    if (content) {
      element.textContent = content;
    }
  },
  LABEL: (element) => {
    if (element.attributes.for) {
      const content = i18n(element.attributes.for.value);
      if (content) {
        element.textContent = content;
      }
    } else {
      i18nTag.generic(element);
    }
  },
  SELECT: (element) => {
    if (!element.id || !element.options.length) {
      return;
    }
    for (let i = 0; i < element.options.length; i++) {
      element.options[i].textContent = i18n(element.id + '_' + element.options[i].value);
    }
  }
};

function i18nHydrate() {
  document.querySelectorAll('[data-i18n]').forEach((element) => {
    if (i18nTag[element.tagName]) {
      i18nTag[element.tagName](element);
    } else {
      i18nTag.generic(element);
    }
  });
  document.querySelectorAll('.current-year').forEach((element) => {
    element.innerText = (new Date()).getFullYear();
  });
}
\ No newline at end of file

A src/js/i18n.js => src/js/i18n.js +2 -0
@@ 0,0 1,2 @@
/* globals i18nHydrate */
i18nHydrate();
\ No newline at end of file

A src/manifest.chrome.json => src/manifest.chrome.json +23 -0
@@ 0,0 1,23 @@
{
  "_notes_chrome_style": "https://developer.chrome.com/extensions/manifest",
  "page_action": {
    "chrome_style": true
  },
  
  "_notes_background": "https://github.com/mozilla/webextension-polyfill",
  "background": {
    "scripts": [
      "js/browser-polyfill.js",
      "js/global.js",
      "js/background.js"
    ]
  },
  
  "options_ui": {
    "page": "options.html",
    "chrome_style": true,
    "open_in_tab": false
  },
  
  "offline_enabled": true
}
\ No newline at end of file

A src/manifest.edge.json => src/manifest.edge.json +14 -0
@@ 0,0 1,14 @@
{  
  "background": {
    "page" : "background.html",
    "persistent": false
  },

  "_notes_-ms-preload": "https://docs.microsoft.com/en-us/microsoft-edge/extensions/guides/porting-chrome-extensions#api-bridges",
  "-ms-preload": {
    "backgroundScript": "js/backgroundScriptsAPIBridge.js",
    "contentScript": "js/contentScriptsAPIBridge.js"
  },

  "options_page": "options.html"
}
\ No newline at end of file

A src/manifest.firefox.json => src/manifest.firefox.json +24 -0
@@ 0,0 1,24 @@

{
  "_notes_incognito": "Disable incognito support for Firefox. https://bugzilla.mozilla.org/show_bug.cgi?id=1380812",
  "incognito": "not_allowed",

  "_notes_background": "Only persistent pages are supported in Firefox.",
  "background": {
    "scripts": [
      "js/global.js",
      "js/background.js"
    ],
    "persistent": true
  },

  "options_ui": {
    "page": "options.html",
    "browser_style": true
  },

  "_notes_page_action": "https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Browser_styles",
  "page_action": {
    "browser_style": true
  }
}
\ No newline at end of file

A src/manifest.json => src/manifest.json +47 -0
@@ 0,0 1,47 @@
{

  "_notes_": "keys starting with '_notes_' will be removed by grunt",
  "_notes_package.json": "where keys overlap, they are taken from package.json",
  "_notes_browsers": "browser specific keys and overrides are taken from: manifest.<BROWSER>.json",

  "manifest_version": 2,
  "description": "__MSG_extension_description__",
  "default_locale": "en",
  "content_security_policy": "default-src 'self'; img-src 'self' data:;",
  "incognito": "split",
  "icons": {
    "19": "img/19.png",
    "20": "img/20.png",
    "30": "img/30.png",
    "35": "img/35.png",
    "38": "img/38.png",
    "40": "img/40.png",
    "48": "img/48.png",
    "96": "img/96.png"
  },
  "permissions": [
    "http://*/.well-known/security.txt",
    "http://*/security.txt",
    "http://*/humans.txt",
    "https://*/.well-known/security.txt",
    "https://*/security.txt",
    "https://*/humans.txt",
    "tabs",
    "activeTab"
  ],
  "page_action": {
    "default_icon": {
      "19": "img/19.png",
      "20": "img/20.png",
      "30": "img/30.png",
      "35": "img/35.png",
      "38": "img/38.png",
      "40": "img/40.png",
      "48": "img/48.png",
      "96": "img/96.png"
    }
  },
  "background": {
    "persistent": false
  }
}
\ No newline at end of file

A src/manifest.opera.json => src/manifest.opera.json +22 -0
@@ 0,0 1,22 @@
{
  "page_action": {
    "chrome_style": true
  },
  
  "_notes_background": "https://github.com/mozilla/webextension-polyfill",
  "background": {
    "scripts": [
      "js/browser-polyfill.js",
      "js/global.js",
      "js/background.js"
    ]
  },
  
  "_notes_options_page": "`open_in_tab: false` is broken on Opera. https://forums.opera.com/topic/36311/bug-options-button-in-extensions-page-does-not-work-opera-64",
  "options_ui": {
    "page": "options.html",
    "open_in_tab": true
  },
  
  "offline_enabled": true
}
\ No newline at end of file

A src/options.html => src/options.html +50 -0
@@ 0,0 1,50 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="options_title"></title>
    <link rel="stylesheet" href="css/options.css"/>
  </head>
  <body>
    <form>
      <div class="browser-style">
        <label for="display_mode" data-i18n></label>
        <select id="display_mode" class="browser-style" data-i18n>
          <option value="INLINE"></option>
          <option value="NEW_TAB"></option>
          <option value="NEW_WINDOW"></option>
        </select>
      </div>
      <div>
        <label for="check_humanstxt" data-i18n></label>
        <select id="check_humanstxt" class="browser-style" data-i18n>
          <option value="ON"></option>
          <option value="OFF"></option>
        </select>
      </div>
      <div>
        <label for="color_theme" data-i18n></label>
        <select id="color_theme" class="browser-style" data-i18n>
          <option value="AUTO"></option>
          <option value="DARK"></option>
          <option value="LIGHT"></option>
        </select>
      </div>
      <div>
        <label for="host_cache_ttl" data-i18n></label>
        <select id="host_cache_ttl" class="browser-style" data-i18n>
          <option value="10M"></option>
          <option value="1H"></option>
          <option value="24H"></option>
          <option value="ALWAYS"></option>
          <option value="NEVER"></option>
        </select>
      </div>
      <div>
        <button type="button" id="reset_default" data-i18n class="browser-style"></button>
      </div>
    </form>
    <script src="js/global.js"></script>
    <script src="js/i18n.js"></script>
  </body>
</html>
\ No newline at end of file

A src/popup.html => src/popup.html +27 -0
@@ 0,0 1,27 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="css/popup.css"/>
    <link rel="stylesheet" href="chrome://browser/content/extension.css"/>
  </head>
  <body>
    <div class="tabs">
      <input type="radio" id="securitytab" name="tabs" checked>
      <label id="securitytablabel" for="securitytab">security.txt</label>
      <input type="radio" id="humanstab" name="tabs">
      <label id="humanstablabel" for="humanstab">humans.txt</label>
      <div id="securitytxt">
        <button type="button" data-i18n="copy_clipboard"></button>
        <textarea spellcheck="false"></textarea>
      </div>
      <div id="humanstxt">
        <button type="button" data-i18n="copy_clipboard"></button>
        <textarea spellcheck="false"></textarea>
      </div>
    </div>
    <script src="js/global.js"></script>
    <script src="js/i18n.js"></script>
    <script src="js/popup.js"></script>
  </body>
</html>
\ No newline at end of file

A src/release.html => src/release.html +25 -0
@@ 0,0 1,25 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="release_title"></title>
    <link rel="stylesheet" href="css/awsm.css"/>
  </head>
  <body>
    <header>
      <h1 data-i18n="release_title"></h1>
    </header>
    <main>
      <article>
        <section>
          <p>...</p>
        </section>
      </article>
    </main>
    <footer>
      <p>&copy; <span class="current-year"></span> Harmless Systems</p>
    </footer>
    <script src="js/global.js"></script>
    <script src="js/i18n.js"></script>
  </body>
</html>
\ No newline at end of file

A yarn.lock => yarn.lock +1859 -0
@@ 0,0 1,1859 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@types/minimatch@^3.0.3":
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
  integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==

abbrev@1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==

ansi-regex@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=

ansi-styles@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=

ansi-styles@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
  dependencies:
    color-convert "^1.9.0"

argparse@^1.0.7:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
  dependencies:
    sprintf-js "~1.0.2"

arr-diff@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=

arr-flatten@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==

arr-union@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=

array-differ@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
  integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==

array-each@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
  integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=

array-find-index@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
  integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=

array-slice@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
  integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==

array-union@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==

array-unique@^0.3.2:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=

arrify@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
  integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==

assign-symbols@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=

async@^2.6.1:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
  dependencies:
    lodash "^4.17.14"

async@~1.5.2:
  version "1.5.2"
  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
  integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=

atob@^2.1.2:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==

balanced-match@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=

base@^0.11.1:
  version "0.11.2"
  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
  dependencies:
    cache-base "^1.0.1"
    class-utils "^0.3.5"
    component-emitter "^1.2.1"
    define-property "^1.0.0"
    isobject "^3.0.1"
    mixin-deep "^1.2.0"
    pascalcase "^0.1.1"

brace-expansion@^1.1.7:
  version "1.1.11"
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
  dependencies:
    balanced-match "^1.0.0"
    concat-map "0.0.1"

braces@^2.3.1:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
  dependencies:
    arr-flatten "^1.1.0"
    array-unique "^0.3.2"
    extend-shallow "^2.0.1"
    fill-range "^4.0.0"
    isobject "^3.0.1"
    repeat-element "^1.1.2"
    snapdragon "^0.8.1"
    snapdragon-node "^2.0.1"
    split-string "^3.0.2"
    to-regex "^3.0.1"

cache-base@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
  dependencies:
    collection-visit "^1.0.0"
    component-emitter "^1.2.1"
    get-value "^2.0.6"
    has-value "^1.0.0"
    isobject "^3.0.1"
    set-value "^2.0.0"
    to-object-path "^0.3.0"
    union-value "^1.0.0"
    unset-value "^1.0.0"

camelcase-keys@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
  integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
  dependencies:
    camelcase "^2.0.0"
    map-obj "^1.0.0"

camelcase@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
  integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=

chalk@^1.1.1:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
  dependencies:
    ansi-styles "^2.2.1"
    escape-string-regexp "^1.0.2"
    has-ansi "^2.0.0"
    strip-ansi "^3.0.0"
    supports-color "^2.0.0"

chalk@^2.4.2, chalk@~2.4.1:
  version "2.4.2"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
  dependencies:
    ansi-styles "^3.2.1"
    escape-string-regexp "^1.0.5"
    supports-color "^5.3.0"

class-utils@^0.3.5:
  version "0.3.6"
  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
  dependencies:
    arr-union "^3.1.0"
    define-property "^0.2.5"
    isobject "^3.0.0"
    static-extend "^0.1.1"

cli@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
  integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=
  dependencies:
    exit "0.1.2"
    glob "^7.1.1"

coffeescript@~1.10.0:
  version "1.10.0"
  resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e"
  integrity sha1-56qDAZF+9iGzXYo580jc3R234z4=

collection-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
  dependencies:
    map-visit "^1.0.0"
    object-visit "^1.0.0"

color-convert@^1.9.0:
  version "1.9.3"
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
  dependencies:
    color-name "1.1.3"

color-name@1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=

colors@~1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
  integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=

component-emitter@^1.2.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==

concat-map@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=

console-browserify@1.1.x:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
  integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
  dependencies:
    date-now "^0.1.4"

copy-descriptor@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=

core-util-is@~1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=

currently-unhandled@^0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
  integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
  dependencies:
    array-find-index "^1.0.1"

date-now@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
  integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=

dateformat@~1.0.12:
  version "1.0.12"
  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
  integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
  dependencies:
    get-stdin "^4.0.1"
    meow "^3.3.0"

debug@^2.2.0, debug@^2.3.3:
  version "2.6.9"
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
  dependencies:
    ms "2.0.0"

decamelize@^1.1.2:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=

decode-uri-component@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=

define-property@^0.2.5:
  version "0.2.5"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
  dependencies:
    is-descriptor "^0.1.0"

define-property@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
  dependencies:
    is-descriptor "^1.0.0"

define-property@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
  dependencies:
    is-descriptor "^1.0.2"
    isobject "^3.0.1"

detect-file@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=

dom-serializer@0:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
  dependencies:
    domelementtype "^2.0.1"
    entities "^2.0.0"

domelementtype@1:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==

domelementtype@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
  integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==

domhandler@2.3:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
  integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg=
  dependencies:
    domelementtype "1"

domutils@1.5:
  version "1.5.1"
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
  integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
  dependencies:
    dom-serializer "0"
    domelementtype "1"

entities@1.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
  integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=

entities@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
  integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==

error-ex@^1.2.0:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
  dependencies:
    is-arrayish "^0.2.1"

escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=

esprima@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==

eventemitter2@~0.4.13:
  version "0.4.14"
  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
  integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=

exit@0.1.2, exit@0.1.x, exit@~0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=

expand-brackets@^2.1.4:
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
  dependencies:
    debug "^2.3.3"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    posix-character-classes "^0.1.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

expand-tilde@^2.0.0, expand-tilde@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
  dependencies:
    homedir-polyfill "^1.0.1"

extend-shallow@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
  dependencies:
    is-extendable "^0.1.0"

extend-shallow@^3.0.0, extend-shallow@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
  dependencies:
    assign-symbols "^1.0.0"
    is-extendable "^1.0.1"

extend@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==

extglob@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
  dependencies:
    array-unique "^0.3.2"
    define-property "^1.0.0"
    expand-brackets "^2.1.4"
    extend-shallow "^2.0.1"
    fragment-cache "^0.2.1"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

file-sync-cmp@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"
  integrity sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=

fill-range@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
  dependencies:
    extend-shallow "^2.0.1"
    is-number "^3.0.0"
    repeat-string "^1.6.1"
    to-regex-range "^2.1.0"

find-up@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
  dependencies:
    path-exists "^2.0.0"
    pinkie-promise "^2.0.0"

find-up@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
  dependencies:
    locate-path "^3.0.0"

findup-sync@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
  integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
  dependencies:
    detect-file "^1.0.0"
    is-glob "^3.1.0"
    micromatch "^3.0.4"
    resolve-dir "^1.0.1"

findup-sync@~0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
  integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=
  dependencies:
    glob "~5.0.0"

fined@^1.0.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
  integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
  dependencies:
    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@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
  integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==

for-in@^1.0.1, for-in@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=

for-own@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
  dependencies:
    for-in "^1.0.1"

fragment-cache@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
  dependencies:
    map-cache "^0.2.2"

fs.realpath@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=

get-stdin@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
  integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=

get-value@^2.0.3, get-value@^2.0.6:
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=

getobject@~0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
  integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=

glob@^7.1.1, glob@^7.1.3:
  version "7.1.6"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.4"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@~5.0.0:
  version "5.0.15"
  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
  integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
  dependencies:
    inflight "^1.0.4"
    inherits "2"
    minimatch "2 || 3"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@~7.0.0:
  version "7.0.6"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
  integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.2"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

global-modules@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
  dependencies:
    global-prefix "^1.0.1"
    is-windows "^1.0.1"
    resolve-dir "^1.0.0"

global-prefix@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
  dependencies:
    expand-tilde "^2.0.2"
    homedir-polyfill "^1.0.1"
    ini "^1.3.4"
    is-windows "^1.0.1"
    which "^1.2.14"

graceful-fs@^4.1.2:
  version "4.2.3"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==

grunt-cli@^1.3.2:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.3.2.tgz#60f12d12c1b5aae94ae3469c6b5fe24e960014e8"
  integrity sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==
  dependencies:
    grunt-known-options "~1.1.0"
    interpret "~1.1.0"
    liftoff "~2.5.0"
    nopt "~4.0.1"
    v8flags "~3.1.1"

grunt-cli@~1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
  integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=
  dependencies:
    findup-sync "~0.3.0"
    grunt-known-options "~1.1.0"
    nopt "~3.0.6"
    resolve "~1.1.0"

grunt-contrib-clean@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz#3be7ca480da4b740aa5e9d863e2f7e8b24f8a68b"
  integrity sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==
  dependencies:
    async "^2.6.1"
    rimraf "^2.6.2"

grunt-contrib-copy@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz#7060c6581e904b8ab0d00f076e0a8f6e3e7c3573"
  integrity sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=
  dependencies:
    chalk "^1.1.1"
    file-sync-cmp "^0.1.0"

grunt-contrib-jshint@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz#3d789807579034299da1b41c4d70e1ba722973ed"
  integrity sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==
  dependencies:
    chalk "^2.4.2"
    hooker "^0.2.3"
    jshint "~2.10.2"

grunt-known-options@~1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
  integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==

grunt-legacy-log-utils@~2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e"
  integrity sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==
  dependencies:
    chalk "~2.4.1"
    lodash "~4.17.10"

grunt-legacy-log@~2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9"
  integrity sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==
  dependencies:
    colors "~1.1.2"
    grunt-legacy-log-utils "~2.0.0"
    hooker "~0.2.3"
    lodash "~4.17.5"

grunt-legacy-util@~1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42"
  integrity sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==
  dependencies:
    async "~1.5.2"
    exit "~0.1.1"
    getobject "~0.1.0"
    hooker "~0.2.3"
    lodash "~4.17.10"
    underscore.string "~3.3.4"
    which "~1.3.0"

grunt-mkdir@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/grunt-mkdir/-/grunt-mkdir-1.0.0.tgz#73e1a26ac24a08596363f4dd954b0d32485e58e9"
  integrity sha1-c+GiasJKCFljY/TdlUsNMkheWOk=

grunt@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38"
  integrity sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==
  dependencies:
    coffeescript "~1.10.0"
    dateformat "~1.0.12"
    eventemitter2 "~0.4.13"
    exit "~0.1.1"
    findup-sync "~0.3.0"
    glob "~7.0.0"
    grunt-cli "~1.2.0"
    grunt-known-options "~1.1.0"
    grunt-legacy-log "~2.0.0"
    grunt-legacy-util "~1.1.1"
    iconv-lite "~0.4.13"
    js-yaml "~3.13.0"
    minimatch "~3.0.2"
    mkdirp "~0.5.1"
    nopt "~3.0.6"
    path-is-absolute "~1.0.0"
    rimraf "~2.6.2"

has-ansi@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
  dependencies:
    ansi-regex "^2.0.0"

has-flag@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=

has-value@^0.3.1:
  version "0.3.1"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
  dependencies:
    get-value "^2.0.3"
    has-values "^0.1.4"
    isobject "^2.0.0"

has-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
  dependencies:
    get-value "^2.0.6"
    has-values "^1.0.0"
    isobject "^3.0.0"

has-values@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=

has-values@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
  dependencies:
    is-number "^3.0.0"
    kind-of "^4.0.0"

homedir-polyfill@^1.0.1:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
  dependencies:
    parse-passwd "^1.0.0"

hooker@^0.2.3, hooker@~0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
  integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=

hosted-git-info@^2.1.4:
  version "2.8.5"
  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
  integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==

htmlparser2@3.8.x:
  version "3.8.3"
  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
  integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg=
  dependencies:
    domelementtype "1"
    domhandler "2.3"
    domutils "1.5"
    entities "1.0"
    readable-stream "1.1"

iconv-lite@~0.4.13:
  version "0.4.24"
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
  dependencies:
    safer-buffer ">= 2.1.2 < 3"

indent-string@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
  integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
  dependencies:
    repeating "^2.0.0"

inflight@^1.0.4:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
  dependencies:
    once "^1.3.0"
    wrappy "1"

inherits@2, inherits@~2.0.1:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==

ini@^1.3.4:
  version "1.3.5"
  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==

interpret@~1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
  integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=

is-absolute@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
  dependencies:
    is-relative "^1.0.0"
    is-windows "^1.0.1"

is-accessor-descriptor@^0.1.6:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
  dependencies:
    kind-of "^3.0.2"

is-accessor-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
  dependencies:
    kind-of "^6.0.0"

is-arrayish@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=

is-buffer@^1.1.5:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==

is-data-descriptor@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
  dependencies:
    kind-of "^3.0.2"

is-data-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
  dependencies:
    kind-of "^6.0.0"

is-descriptor@^0.1.0:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
  dependencies:
    is-accessor-descriptor "^0.1.6"
    is-data-descriptor "^0.1.4"
    kind-of "^5.0.0"

is-descriptor@^1.0.0, is-descriptor@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
  dependencies:
    is-accessor-descriptor "^1.0.0"
    is-data-descriptor "^1.0.0"
    kind-of "^6.0.2"

is-extendable@^0.1.0, is-extendable@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=

is-extendable@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
  dependencies:
    is-plain-object "^2.0.4"

is-extglob@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=

is-finite@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
  integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
  dependencies:
    number-is-nan "^1.0.0"

is-glob@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
  dependencies:
    is-extglob "^2.1.0"

is-number@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
  dependencies:
    kind-of "^3.0.2"

is-plain-object@^2.0.3, is-plain-object@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
  dependencies:
    isobject "^3.0.1"

is-relative@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
  dependencies:
    is-unc-path "^1.0.0"

is-unc-path@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
  dependencies:
    unc-path-regex "^0.1.2"

is-utf8@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
  integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=

is-windows@^1.0.1, is-windows@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==

isarray@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=

isarray@1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=

isexe@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=

isobject@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
  dependencies:
    isarray "1.0.0"

isobject@^3.0.0, isobject@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=

js-yaml@~3.13.0:
  version "3.13.1"
  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
  dependencies:
    argparse "^1.0.7"
    esprima "^4.0.0"

jshint@~2.10.2:
  version "2.10.3"
  resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.3.tgz#98dc765bf6920b41bc2719f76b8739d6f6e93a9c"
  integrity sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==
  dependencies:
    cli "~1.0.0"
    console-browserify "1.1.x"
    exit "0.1.x"
    htmlparser2 "3.8.x"
    lodash "~4.17.11"
    minimatch "~3.0.2"
    shelljs "0.3.x"
    strip-json-comments "1.0.x"

kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==

kind-of@^6.0.0, kind-of@^6.0.2:
  version "6.0.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
  integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==

liftoff@~2.5.0:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
  integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
  dependencies:
    extend "^3.0.0"
    findup-sync "^2.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"

load-grunt-tasks@^5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz#14894c27a7e34ebbef9937c39cc35c573cd04c1c"
  integrity sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==
  dependencies:
    arrify "^2.0.1"
    multimatch "^4.0.0"
    pkg-up "^3.1.0"
    resolve-pkg "^2.0.0"

load-json-file@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
  integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
  dependencies:
    graceful-fs "^4.1.2"
    parse-json "^2.2.0"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"
    strip-bom "^2.0.0"

locate-path@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
  integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
  dependencies:
    p-locate "^3.0.0"
    path-exists "^3.0.0"

lodash@^4.17.14, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5:
  version "4.17.15"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
  integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==

loud-rejection@^1.0.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
  integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
  dependencies:
    currently-unhandled "^0.4.1"
    signal-exit "^3.0.0"

make-iterator@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
  integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
  dependencies:
    kind-of "^6.0.2"

map-cache@^0.2.0, map-cache@^0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=

map-obj@^1.0.0, map-obj@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
  integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=

map-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
  dependencies:
    object-visit "^1.0.0"

meow@^3.3.0:
  version "3.7.0"
  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
  integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
  dependencies:
    camelcase-keys "^2.0.0"
    decamelize "^1.1.2"
    loud-rejection "^1.0.0"
    map-obj "^1.0.1"
    minimist "^1.1.3"
    normalize-package-data "^2.3.4"
    object-assign "^4.0.1"
    read-pkg-up "^1.0.1"
    redent "^1.0.0"
    trim-newlines "^1.0.0"

micromatch@^3.0.4:
  version "3.1.10"
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    braces "^2.3.1"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    extglob "^2.0.4"
    fragment-cache "^0.2.1"
    kind-of "^6.0.2"
    nanomatch "^1.2.9"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.2"

"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
  dependencies:
    brace-expansion "^1.1.7"

minimist@0.0.8:
  version "0.0.8"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=

minimist@^1.1.3:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
  integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=

mixin-deep@^1.2.0:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
  dependencies:
    for-in "^1.0.2"
    is-extendable "^1.0.1"

mkdirp@~0.5.1:
  version "0.5.1"
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
  dependencies:
    minimist "0.0.8"

ms@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=

multimatch@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
  integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
  dependencies:
    "@types/minimatch" "^3.0.3"
    array-differ "^3.0.0"
    array-union "^2.1.0"
    arrify "^2.0.1"
    minimatch "^3.0.4"

nanomatch@^1.2.9:
  version "1.2.13"
  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    fragment-cache "^0.2.1"
    is-windows "^1.0.2"
    kind-of "^6.0.2"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

nopt@~3.0.6:
  version "3.0.6"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
  integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
  dependencies:
    abbrev "1"

nopt@~4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
  integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
  dependencies:
    abbrev "1"
    osenv "^0.1.4"

normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
  dependencies:
    hosted-git-info "^2.1.4"
    resolve "^1.10.0"
    semver "2 || 3 || 4 || 5"
    validate-npm-package-license "^3.0.1"

number-is-nan@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=

object-assign@^4.0.1:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=

object-copy@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
  dependencies:
    copy-descriptor "^0.1.0"
    define-property "^0.2.5"
    kind-of "^3.0.3"

object-visit@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
  dependencies:
    isobject "^3.0.0"

object.defaults@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
  integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
  dependencies:
    array-each "^1.0.1"
    array-slice "^1.0.0"
    for-own "^1.0.0"
    isobject "^3.0.0"

object.map@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
  integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
  dependencies:
    for-own "^1.0.0"
    make-iterator "^1.0.0"

object.pick@^1.2.0, object.pick@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
  dependencies:
    isobject "^3.0.1"

once@^1.3.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
  dependencies:
    wrappy "1"

os-homedir@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=

os-tmpdir@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=

osenv@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
  integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
  dependencies:
    os-homedir "^1.0.0"
    os-tmpdir "^1.0.0"

p-limit@^2.0.0:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
  integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
  dependencies:
    p-try "^2.0.0"

p-locate@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
  integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
  dependencies:
    p-limit "^2.0.0"

p-try@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==

parse-filepath@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
  integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
  dependencies:
    is-absolute "^1.0.0"
    map-cache "^0.2.0"
    path-root "^0.1.1"

parse-json@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
  dependencies:
    error-ex "^1.2.0"

parse-passwd@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=

pascalcase@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=

path-exists@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
  dependencies:
    pinkie-promise "^2.0.0"

path-exists@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=

path-is-absolute@^1.0.0, path-is-absolute@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=

path-parse@^1.0.6:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==

path-root-regex@^0.1.0:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
  integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=

path-root@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
  integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
  dependencies:
    path-root-regex "^0.1.0"

path-type@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
  integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
  dependencies:
    graceful-fs "^4.1.2"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"

pify@^2.0.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=

pinkie-promise@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
  dependencies:
    pinkie "^2.0.0"

pinkie@^2.0.0:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=

pkg-up@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
  integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
  dependencies:
    find-up "^3.0.0"

posix-character-classes@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=

read-pkg-up@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
  integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
  dependencies:
    find-up "^1.0.0"
    read-pkg "^1.0.0"

read-pkg@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
  integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
  dependencies:
    load-json-file "^1.0.0"
    normalize-package-data "^2.3.2"
    path-type "^1.0.0"

readable-stream@1.1:
  version "1.1.13"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
  integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "0.0.1"
    string_decoder "~0.10.x"

rechoir@^0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
  integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
  dependencies:
    resolve "^1.1.6"

redent@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
  integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
  dependencies:
    indent-string "^2.1.0"
    strip-indent "^1.0.1"

regex-not@^1.0.0, regex-not@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
  dependencies:
    extend-shallow "^3.0.2"
    safe-regex "^1.1.0"

repeat-element@^1.1.2:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==

repeat-string@^1.6.1:
  version "1.6.1"
  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=

repeating@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
  integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
  dependencies:
    is-finite "^1.0.0"

resolve-dir@^1.0.0, resolve-dir@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
  dependencies:
    expand-tilde "^2.0.0"
    global-modules "^1.0.0"

resolve-from@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==

resolve-pkg@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41"
  integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==
  dependencies:
    resolve-from "^5.0.0"

resolve-url@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=

resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0:
  version "1.14.1"
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff"
  integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==
  dependencies:
    path-parse "^1.0.6"

resolve@~1.1.0:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=

ret@~0.1.10:
  version "0.1.15"
  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==

rimraf@^2.6.2:
  version "2.7.1"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
  dependencies:
    glob "^7.1.3"

rimraf@~2.6.2:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
  dependencies:
    glob "^7.1.3"

safe-regex@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
  dependencies:
    ret "~0.1.10"

"safer-buffer@>= 2.1.2 < 3":
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

"semver@2 || 3 || 4 || 5":
  version "5.7.1"
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==

set-value@^2.0.0, set-value@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
  dependencies:
    extend-shallow "^2.0.1"
    is-extendable "^0.1.1"
    is-plain-object "^2.0.3"
    split-string "^3.0.1"

shelljs@0.3.x:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
  integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=

signal-exit@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
  integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=

snapdragon-node@^2.0.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
  dependencies:
    define-property "^1.0.0"
    isobject "^3.0.0"
    snapdragon-util "^3.0.1"

snapdragon-util@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
  dependencies:
    kind-of "^3.2.0"

snapdragon@^0.8.1:
  version "0.8.2"
  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
  dependencies:
    base "^0.11.1"
    debug "^2.2.0"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    map-cache "^0.2.2"
    source-map "^0.5.6"
    source-map-resolve "^0.5.0"
    use "^3.1.0"

source-map-resolve@^0.5.0:
  version "0.5.3"
  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
  dependencies:
    atob "^2.1.2"
    decode-uri-component "^0.2.0"
    resolve-url "^0.2.1"
    source-map-url "^0.4.0"
    urix "^0.1.0"

source-map-url@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=

source-map@^0.5.6:
  version "0.5.7"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=

spdx-correct@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
  integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
  dependencies:
    spdx-expression-parse "^3.0.0"
    spdx-license-ids "^3.0.0"

spdx-exceptions@^2.1.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
  integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==

spdx-expression-parse@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
  integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
  dependencies:
    spdx-exceptions "^2.1.0"
    spdx-license-ids "^3.0.0"

spdx-license-ids@^3.0.0:
  version "3.0.5"
  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==

split-string@^3.0.1, split-string@^3.0.2:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
  dependencies:
    extend-shallow "^3.0.0"

sprintf-js@^1.0.3:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
  integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==

sprintf-js@~1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=

static-extend@^0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
  dependencies:
    define-property "^0.2.5"
    object-copy "^0.1.0"

string_decoder@~0.10.x:
  version "0.10.31"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=

strip-ansi@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
  dependencies:
    ansi-regex "^2.0.0"

strip-bom@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
  integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
  dependencies:
    is-utf8 "^0.2.0"

strip-indent@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
  integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
  dependencies:
    get-stdin "^4.0.1"

strip-json-comments@1.0.x:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
  integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=

supports-color@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=

supports-color@^5.3.0:
  version "5.5.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
  dependencies:
    has-flag "^3.0.0"

to-object-path@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
  dependencies:
    kind-of "^3.0.2"

to-regex-range@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
  dependencies:
    is-number "^3.0.0"
    repeat-string "^1.6.1"

to-regex@^3.0.1, to-regex@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
  dependencies:
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    regex-not "^1.0.2"
    safe-regex "^1.1.0"

trim-newlines@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
  integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=

unc-path-regex@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=

underscore.string@~3.3.4:
  version "3.3.5"
  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
  integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
  dependencies:
    sprintf-js "^1.0.3"
    util-deprecate "^1.0.2"

union-value@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
  dependencies:
    arr-union "^3.1.0"
    get-value "^2.0.6"
    is-extendable "^0.1.1"
    set-value "^2.0.1"

unset-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
  dependencies:
    has-value "^0.3.1"
    isobject "^3.0.0"

urix@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=

use@^3.1.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==

util-deprecate@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=

v8flags@~3.1.1:
  version "3.1.3"
  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
  integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
  dependencies:
    homedir-polyfill "^1.0.1"

validate-npm-package-license@^3.0.1:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
  dependencies:
    spdx-correct "^3.0.0"
    spdx-expression-parse "^3.0.0"

webextension-polyfill@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.6.0.tgz#1afd925f3274a0d4848083579b9c0b649a5c6763"
  integrity sha512-PlYwiX8e4bNZrEeBFxbFFsLtm0SMPxJliLTGdNCA0Bq2XkWrAn2ejUd+89vZm+8BnfFB1BclJyCz3iKsm2atNg==

which@^1.2.14, which@~1.3.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
  dependencies:
    isexe "^2.0.0"

wrappy@1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=