diff --git a/node_modules/v8flags/LICENSE b/node_modules/v8flags/LICENSE
new file mode 100644
index 0000000..ca63f90
--- /dev/null
+++ b/node_modules/v8flags/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2018 Tyler Kellen <tyler@sleekcode.net>, Blaine Bublitz <blaine.bublitz@gmail.com>, and Eric Schoffstall <yo@contra.io>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/v8flags/README.md b/node_modules/v8flags/README.md
new file mode 100644
index 0000000..2760f8e
--- /dev/null
+++ b/node_modules/v8flags/README.md
@@ -0,0 +1,64 @@
+<p align="center">
+  <a href="http://gulpjs.com">
+    <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png">
+  </a>
+</p>
+
+# v8flags
+
+[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url]
+
+Get available v8 flags.
+
+## Usage
+```js
+const v8flags = require('v8flags');
+
+v8flags(function(err, results) {
+  console.log(results);
+  // [ '--use_strict',
+  //   '--es5_readonly',
+  //   '--es52_globals',
+  //   '--harmony_typeof',
+  //   '--harmony_scoping',
+  //   '--harmony_modules',
+  //   '--harmony_proxies',
+  //   '--harmony_collections',
+  //   '--harmony',
+  // ...
+});
+```
+
+## API
+
+### `v8flags(cb)`
+
+Finds the available flags and calls the passed callback with any errors and an array of flag results.
+
+### `v8flags.configfile`
+
+The name of the cache file for flags.
+
+### `v8flags.configPath`
+
+The filepath location of the `configfile` above.
+
+## License
+
+MIT
+
+[downloads-image]: http://img.shields.io/npm/dm/v8flags.svg
+[npm-url]: https://www.npmjs.com/package/v8flags
+[npm-image]: http://img.shields.io/npm/v/v8flags.svg
+
+[travis-url]: https://travis-ci.org/gulpjs/v8flags
+[travis-image]: http://img.shields.io/travis/gulpjs/v8flags.svg?label=travis-ci
+
+[appveyor-url]: https://ci.appveyor.com/project/gulpjs/v8flags
+[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/v8flags.svg?label=appveyor
+
+[coveralls-url]: https://coveralls.io/r/gulpjs/v8flags
+[coveralls-image]: http://img.shields.io/coveralls/gulpjs/v8flags/master.svg
+
+[gitter-url]: https://gitter.im/gulpjs/gulp
+[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg
diff --git a/node_modules/v8flags/config-path.js b/node_modules/v8flags/config-path.js
new file mode 100644
index 0000000..1acbe45
--- /dev/null
+++ b/node_modules/v8flags/config-path.js
@@ -0,0 +1,38 @@
+var os = require('os');
+var path = require('path');
+var userHome = require('homedir-polyfill')();
+
+var env = process.env;
+var name = 'js-v8flags';
+
+function macos() {
+  var library = path.join(userHome, 'Library');
+  return path.join(library, 'Caches', name);
+}
+
+function windows() {
+  var appData = env.LOCALAPPDATA || path.join(userHome, 'AppData', 'Local');
+  return path.join(appData, name);
+}
+
+// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
+function linux() {
+  var username = path.basename(userHome);
+  return path.join(env.XDG_CACHE_HOME || path.join(userHome, '.cache'), name);
+}
+
+module.exports = function(platform) {
+  if (!userHome) {
+    return os.tmpdir();
+  }
+
+  if (platform === 'darwin') {
+    return macos();
+  }
+
+  if (platform === 'win32') {
+    return windows();
+  }
+
+  return linux();
+};
diff --git a/node_modules/v8flags/index.js b/node_modules/v8flags/index.js
new file mode 100644
index 0000000..f8ebcc1
--- /dev/null
+++ b/node_modules/v8flags/index.js
@@ -0,0 +1,162 @@
+// this entire module is depressing. i should have spent my time learning
+// how to patch v8 so that these options would just be available on the
+// process object.
+
+var os = require('os');
+var fs = require('fs');
+var path = require('path');
+var crypto = require('crypto');
+var execFile = require('child_process').execFile;
+var configPath = require('./config-path.js')(process.platform);
+var version = require('./package.json').version;
+var env = process.env;
+var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME || '';
+var exclusions = ['--help'];
+
+// This number must be incremented whenever the generated cache file changes.
+var CACHE_VERSION = 1;
+
+var configfile = '.v8flags-' + CACHE_VERSION + '-' + process.versions.v8 + '.' + crypto.createHash('md5').update(user).digest('hex') + '.json';
+
+var failureMessage = [
+  'Unable to cache a config file for v8flags to your home directory',
+  'or a temporary folder. To fix this problem, please correct your',
+  'environment by setting HOME=/path/to/home or TEMP=/path/to/temp.',
+  'NOTE: the user running this must be able to access provided path.',
+  'If all else fails, please open an issue here:',
+  'http://github.com/tkellen/js-v8flags',
+].join('\n');
+
+function fail(err) {
+  err.message += '\n\n' + failureMessage;
+  return err;
+}
+
+function openConfig(cb) {
+  fs.mkdir(configPath, function() {
+    tryOpenConfig(path.join(configPath, configfile), function(err, fd) {
+      if (err) {
+        return tryOpenConfig(path.join(os.tmpdir(), configfile), cb);
+      }
+      return cb(null, fd);
+    });
+  });
+}
+
+function tryOpenConfig(configpath, cb) {
+  try {
+    // if the config file is valid, it should be json and therefore
+    // node should be able to require it directly. if this doesn't
+    // throw, we're done!
+    var content = require(configpath);
+    process.nextTick(function() {
+      cb(null, content);
+    });
+  } catch (e) {
+    // if requiring the config file failed, maybe it doesn't exist, or
+    // perhaps it has become corrupted. instead of calling back with the
+    // content of the file, call back with a file descriptor that we can
+    // write the cached data to
+    fs.open(configpath, 'w+', function(err, fd) {
+      if (err) {
+        return cb(err);
+      }
+      return cb(null, fd);
+    });
+  }
+}
+
+// Node <= 9 outputs _ in flags with multiple words, while node 10
+// uses -. Both ways are accepted anyway, so always use `_` for better
+// compatibility.
+// We must not replace the first two --.
+function normalizeFlagName(flag) {
+  return '--' + flag.slice(4).replace(/-/g, '_');
+}
+
+// i can't wait for the day this whole module is obsolete because these
+// options are available on the process object. this executes node with
+// `--v8-options` and parses the result, returning an array of command
+// line flags.
+function getFlags(cb) {
+  execFile(process.execPath, ['--v8-options'], function(execErr, result) {
+    if (execErr) {
+      return cb(execErr);
+    }
+    // If the binary doesn't return flags in the way we expect, default to an empty array
+    // Reference https://github.com/gulpjs/v8flags/issues/53
+    var matchedFlags = result.match(/\s\s--[\w-]+/gm) || [];
+    var flags = matchedFlags
+      .map(normalizeFlagName)
+      .filter(function(name) {
+        return exclusions.indexOf(name) === -1;
+      });
+    return cb(null, flags);
+  });
+}
+
+// write some json to a file descriptor. if this fails, call back
+// with both the error and the data that was meant to be written.
+function writeConfig(fd, flags, cb) {
+  var json = JSON.stringify(flags);
+  var buf;
+  if (Buffer.from && Buffer.from !== Uint8Array.from) {
+    // Node.js 4.5.0 or newer
+    buf = Buffer.from(json);
+  } else {
+    // Old Node.js versions
+    // The typeof safeguard below is mostly against accidental copy-pasting
+    // and code rewrite, it never happens as json is always a string here.
+    if (typeof json === 'number') {
+      throw new Error('Unexpected type number');
+    }
+    buf = new Buffer(json);
+  }
+  return fs.write(fd, buf, 0, buf.length, 0 , function(writeErr) {
+    fs.close(fd, function(closeErr) {
+      var err = writeErr || closeErr;
+      if (err) {
+        return cb(fail(err), flags);
+      }
+      return cb(null, flags);
+    });
+  });
+}
+
+module.exports = function(cb) {
+  // bail early if this is not node
+  var isElectron = process.versions && process.versions.electron;
+  if (isElectron) {
+    return process.nextTick(function() {
+      cb(null, []);
+    });
+  }
+
+  // attempt to open/read cache file
+  openConfig(function(openErr, result) {
+    if (!openErr && typeof result !== 'number') {
+      return cb(null, result);
+    }
+    // if the result is not an array, we need to go fetch
+    // the flags by invoking node with `--v8-options`
+    getFlags(function(flagsErr, flags) {
+      // if there was an error fetching the flags, bail immediately
+      if (flagsErr) {
+        return cb(flagsErr);
+      }
+      // if there was a problem opening the config file for writing
+      // throw an error but include the flags anyway so that users
+      // can continue to execute (at the expense of having to fetch
+      // flags on every run until they fix the underyling problem).
+      if (openErr) {
+        return cb(fail(openErr), flags);
+      }
+      // write the config file to disk so subsequent runs can read
+      // flags out of a cache file.
+      return writeConfig(result, flags, cb);
+    });
+  });
+};
+
+module.exports.configfile = configfile;
+module.exports.configPath = configPath;
diff --git a/node_modules/v8flags/package.json b/node_modules/v8flags/package.json
new file mode 100644
index 0000000..50765dc
--- /dev/null
+++ b/node_modules/v8flags/package.json
@@ -0,0 +1,99 @@
+{
+  "_from": "v8flags@~3.1.1",
+  "_id": "v8flags@3.1.3",
+  "_inBundle": false,
+  "_integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
+  "_location": "/v8flags",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "v8flags@~3.1.1",
+    "name": "v8flags",
+    "escapedName": "v8flags",
+    "rawSpec": "~3.1.1",
+    "saveSpec": null,
+    "fetchSpec": "~3.1.1"
+  },
+  "_requiredBy": [
+    "/grunt/grunt-cli"
+  ],
+  "_resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
+  "_shasum": "fc9dc23521ca20c5433f81cc4eb9b3033bb105d8",
+  "_spec": "v8flags@~3.1.1",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\grunt\\node_modules\\grunt-cli",
+  "author": {
+    "name": "Gulp Team",
+    "email": "team@gulpjs.com",
+    "url": "http://gulpjs.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/gulpjs/v8flags/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Tyler Kellen",
+      "email": "tyler@sleekcode.net"
+    },
+    {
+      "name": "Blaine Bublitz",
+      "email": "blaine.bublitz@gmail.com"
+    },
+    {
+      "name": "Nicolò Ribaudo",
+      "email": "nicolo.ribaudo@gmail.com"
+    },
+    {
+      "name": "Selwyn",
+      "email": "talk@selwyn.cc"
+    },
+    {
+      "name": "Leo Zhang",
+      "email": "leo@leozhang.me"
+    }
+  ],
+  "dependencies": {
+    "homedir-polyfill": "^1.0.1"
+  },
+  "deprecated": false,
+  "description": "Get available v8 flags.",
+  "devDependencies": {
+    "async": "^2.5.0",
+    "eslint": "^2.13.0",
+    "eslint-config-gulp": "^3.0.1",
+    "expect": "^1.20.2",
+    "istanbul": "^0.4.3",
+    "istanbul-coveralls": "^1.0.3",
+    "mocha": "^3.5.3",
+    "proxyquire": "^1.8.0"
+  },
+  "engines": {
+    "node": ">= 0.10"
+  },
+  "files": [
+    "index.js",
+    "config-path.js",
+    "LICENSE"
+  ],
+  "homepage": "https://github.com/gulpjs/v8flags#readme",
+  "keywords": [
+    "v8 flags",
+    "harmony flags"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "v8flags",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/gulpjs/v8flags.git"
+  },
+  "scripts": {
+    "cover": "istanbul cover _mocha --report lcovonly",
+    "coveralls": "npm run cover && istanbul-coveralls",
+    "lint": "eslint .",
+    "pretest": "npm run lint",
+    "test": "mocha --async-only"
+  },
+  "version": "3.1.3"
+}
