Index: frontend/node_modules/estree-walker/CHANGELOG.md
===================================================================
--- frontend/node_modules/estree-walker/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,79 @@
+# changelog
+
+## 1.0.1
+
+* Relax node type to `BaseNode` ([#17](https://github.com/Rich-Harris/estree-walker/pull/17))
+
+## 1.0.0
+
+* Don't cache child keys
+
+## 0.9.0
+
+* Add `this.remove()` method
+
+## 0.8.1
+
+* Fix pkg.files
+
+## 0.8.0
+
+* Adopt `estree` types
+
+## 0.7.0
+
+* Add a `this.replace(node)` method
+
+## 0.6.1
+
+* Only traverse nodes that exist and have a type ([#9](https://github.com/Rich-Harris/estree-walker/pull/9))
+* Only cache keys for nodes with a type ([#8](https://github.com/Rich-Harris/estree-walker/pull/8))
+
+## 0.6.0
+
+* Fix walker context type
+* Update deps, remove unncessary Bublé transformation
+
+## 0.5.2
+
+* Add types to package
+
+## 0.5.1
+
+* Prevent context corruption when `walk()` is called during a walk
+
+## 0.5.0
+
+* Export `childKeys`, for manually fixing in case of malformed ASTs
+
+## 0.4.0
+
+* Add TypeScript typings ([#3](https://github.com/Rich-Harris/estree-walker/pull/3))
+
+## 0.3.1
+
+* Include `pkg.repository` ([#2](https://github.com/Rich-Harris/estree-walker/pull/2))
+
+## 0.3.0
+
+* More predictable ordering
+
+## 0.2.1
+
+* Keep `context` shape
+
+## 0.2.0
+
+* Add ES6 build
+
+## 0.1.3
+
+* npm snafu
+
+## 0.1.2
+
+* Pass current prop and index to `enter`/`leave` callbacks
+
+## 0.1.1
+
+* First release
Index: frontend/node_modules/estree-walker/README.md
===================================================================
--- frontend/node_modules/estree-walker/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,48 @@
+# estree-walker
+
+Simple utility for walking an [ESTree](https://github.com/estree/estree)-compliant AST, such as one generated by [acorn](https://github.com/marijnh/acorn).
+
+
+## Installation
+
+```bash
+npm i estree-walker
+```
+
+
+## Usage
+
+```js
+var walk = require( 'estree-walker' ).walk;
+var acorn = require( 'acorn' );
+
+ast = acorn.parse( sourceCode, options ); // https://github.com/acornjs/acorn
+
+walk( ast, {
+  enter: function ( node, parent, prop, index ) {
+    // some code happens
+  },
+  leave: function ( node, parent, prop, index ) {
+  	// some code happens
+  }
+});
+```
+
+Inside the `enter` function, calling `this.skip()` will prevent the node's children being walked, or the `leave` function (which is optional) being called.
+
+Call `this.replace(new_node)` in either `enter` or `leave` to replace the current node with a new one.
+
+Call `this.remove()` in either `enter` or `leave` to remove the current node.
+
+## Why not use estraverse?
+
+The ESTree spec is evolving to accommodate ES6/7. I've had a couple of experiences where [estraverse](https://github.com/estools/estraverse) was unable to handle an AST generated by recent versions of acorn, because it hard-codes visitor keys.
+
+estree-walker, by contrast, simply enumerates a node's properties to find child nodes (and child lists of nodes), and is therefore resistant to spec changes. It's also much smaller. (The performance, if you're wondering, is basically identical.)
+
+None of which should be taken as criticism of estraverse, which has more features and has been battle-tested in many more situations, and for which I'm very grateful.
+
+
+## License
+
+MIT
Index: frontend/node_modules/estree-walker/dist/estree-walker.umd.js
===================================================================
--- frontend/node_modules/estree-walker/dist/estree-walker.umd.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/dist/estree-walker.umd.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,135 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+	(factory((global.estreeWalker = {})));
+}(this, (function (exports) { 'use strict';
+
+	function walk(ast, { enter, leave }) {
+		return visit(ast, null, enter, leave);
+	}
+
+	let should_skip = false;
+	let should_remove = false;
+	let replacement = null;
+	const context = {
+		skip: () => should_skip = true,
+		remove: () => should_remove = true,
+		replace: (node) => replacement = node
+	};
+
+	function replace(parent, prop, index, node) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop][index] = node;
+			} else {
+				parent[prop] = node;
+			}
+		}
+	}
+
+	function remove(parent, prop, index) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop].splice(index, 1);
+			} else {
+				delete parent[prop];
+			}
+		}
+	}
+
+	function visit(
+		node,
+		parent,
+		enter,
+		leave,
+		prop,
+		index
+	) {
+		if (node) {
+			if (enter) {
+				const _should_skip = should_skip;
+				const _should_remove = should_remove;
+				const _replacement = replacement;
+				should_skip = false;
+				should_remove = false;
+				replacement = null;
+
+				enter.call(context, node, parent, prop, index);
+
+				if (replacement) {
+					node = replacement;
+					replace(parent, prop, index, node);
+				}
+
+				if (should_remove) {
+					remove(parent, prop, index);
+				}
+
+				const skipped = should_skip;
+				const removed = should_remove;
+
+				should_skip = _should_skip;
+				should_remove = _should_remove;
+				replacement = _replacement;
+
+				if (skipped) return node;
+				if (removed) return null;
+			}
+
+			for (const key in node) {
+				const value = (node )[key];
+
+				if (typeof value !== 'object') {
+					continue;
+				}
+
+				else if (Array.isArray(value)) {
+					for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
+						if (value[j] !== null && typeof value[j].type === 'string') {
+							if (!visit(value[j], node, enter, leave, key, k)) {
+								// removed
+								j--;
+							}
+						}
+					}
+				}
+
+				else if (value !== null && typeof value.type === 'string') {
+					visit(value, node, enter, leave, key, null);
+				}
+			}
+
+			if (leave) {
+				const _replacement = replacement;
+				const _should_remove = should_remove;
+				replacement = null;
+				should_remove = false;
+
+				leave.call(context, node, parent, prop, index);
+
+				if (replacement) {
+					node = replacement;
+					replace(parent, prop, index, node);
+				}
+
+				if (should_remove) {
+					remove(parent, prop, index);
+				}
+
+				const removed = should_remove;
+
+				replacement = _replacement;
+				should_remove = _should_remove;
+
+				if (removed) return null;
+			}
+		}
+
+		return node;
+	}
+
+	exports.walk = walk;
+
+	Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
Index: frontend/node_modules/estree-walker/dist/estree-walker.umd.js.map
===================================================================
--- frontend/node_modules/estree-walker/dist/estree-walker.umd.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/dist/estree-walker.umd.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"estree-walker.umd.js","sources":["../src/estree-walker.js"],"sourcesContent":["export function walk(ast, { enter, leave }) {\n\tvisit(ast, null, enter, leave);\n}\n\nlet shouldSkip = false;\nconst context = { skip: () => shouldSkip = true };\n\nexport const childKeys = {};\n\nconst toString = Object.prototype.toString;\n\nfunction isArray(thing) {\n\treturn toString.call(thing) === '[object Array]';\n}\n\nfunction visit(node, parent, enter, leave, prop, index) {\n\tif (!node) return;\n\n\tif (enter) {\n\t\tconst _shouldSkip = shouldSkip;\n\t\tshouldSkip = false;\n\t\tenter.call(context, node, parent, prop, index);\n\t\tconst skipped = shouldSkip;\n\t\tshouldSkip = _shouldSkip;\n\n\t\tif (skipped) return;\n\t}\n\n\tconst keys = childKeys[node.type] || (\n\t\tchildKeys[node.type] = Object.keys(node).filter(key => typeof node[key] === 'object')\n\t);\n\n\tfor (let i = 0; i < keys.length; i += 1) {\n\t\tconst key = keys[i];\n\t\tconst value = node[key];\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let j = 0; j < value.length; j += 1) {\n\t\t\t\tvisit(value[j], node, enter, leave, key, j);\n\t\t\t}\n\t\t}\n\n\t\telse if (value && value.type) {\n\t\t\tvisit(value, node, enter, leave, key, null);\n\t\t}\n\t}\n\n\tif (leave) {\n\t\tleave(node, parent, prop, index);\n\t}\n}\n"],"names":[],"mappings":";;;;;;CAAO,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;CAC5C,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAChC,CAAC;;CAED,IAAI,UAAU,GAAG,KAAK,CAAC;CACvB,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC;;AAElD,AAAY,OAAC,SAAS,GAAG,EAAE,CAAC;;CAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;;CAE3C,SAAS,OAAO,CAAC,KAAK,EAAE;CACxB,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAAC;CAClD,CAAC;;CAED,SAAS,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;CACxD,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO;;CAEnB,CAAC,IAAI,KAAK,EAAE;CACZ,EAAE,MAAM,WAAW,GAAG,UAAU,CAAC;CACjC,EAAE,UAAU,GAAG,KAAK,CAAC;CACrB,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;CACjD,EAAE,MAAM,OAAO,GAAG,UAAU,CAAC;CAC7B,EAAE,UAAU,GAAG,WAAW,CAAC;;CAE3B,EAAE,IAAI,OAAO,EAAE,OAAO;CACtB,EAAE;;CAEF,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;CAClC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC;CACvF,EAAE,CAAC;;CAEH,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;CAC1C,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;CACtB,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;CAE1B,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;CACtB,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;CAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAChD,IAAI;CACJ,GAAG;;CAEH,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;CAChC,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;CAC/C,GAAG;CACH,EAAE;;CAEF,CAAC,IAAI,KAAK,EAAE;CACZ,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;CACnC,EAAE;CACF,CAAC;;;;;;;;;;;;;"}
Index: frontend/node_modules/estree-walker/package.json
===================================================================
--- frontend/node_modules/estree-walker/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+{
+  "name": "estree-walker",
+  "description": "Traverse an ESTree-compliant AST",
+  "version": "1.0.1",
+  "author": "Rich Harris",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Rich-Harris/estree-walker"
+  },
+  "main": "dist/estree-walker.umd.js",
+  "module": "src/estree-walker.js",
+  "types": "types/index.d.ts",
+  "scripts": {
+    "prepublishOnly": "npm run build && npm test",
+    "build": "tsc && rollup -c",
+    "test": "mocha --opts mocha.opts"
+  },
+  "devDependencies": {
+    "@types/estree": "0.0.39",
+    "mocha": "^5.2.0",
+    "rollup": "^0.67.3",
+    "rollup-plugin-sucrase": "^2.1.0",
+    "typescript": "^3.6.3"
+  },
+  "files": [
+    "src",
+    "dist",
+    "types",
+    "README.md"
+  ]
+}
Index: frontend/node_modules/estree-walker/src/estree-walker.js
===================================================================
--- frontend/node_modules/estree-walker/src/estree-walker.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/src/estree-walker.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,125 @@
+function walk(ast, { enter, leave }) {
+	return visit(ast, null, enter, leave);
+}
+
+let should_skip = false;
+let should_remove = false;
+let replacement = null;
+const context = {
+	skip: () => should_skip = true,
+	remove: () => should_remove = true,
+	replace: (node) => replacement = node
+};
+
+function replace(parent, prop, index, node) {
+	if (parent) {
+		if (index !== null) {
+			parent[prop][index] = node;
+		} else {
+			parent[prop] = node;
+		}
+	}
+}
+
+function remove(parent, prop, index) {
+	if (parent) {
+		if (index !== null) {
+			parent[prop].splice(index, 1);
+		} else {
+			delete parent[prop];
+		}
+	}
+}
+
+function visit(
+	node,
+	parent,
+	enter,
+	leave,
+	prop,
+	index
+) {
+	if (node) {
+		if (enter) {
+			const _should_skip = should_skip;
+			const _should_remove = should_remove;
+			const _replacement = replacement;
+			should_skip = false;
+			should_remove = false;
+			replacement = null;
+
+			enter.call(context, node, parent, prop, index);
+
+			if (replacement) {
+				node = replacement;
+				replace(parent, prop, index, node);
+			}
+
+			if (should_remove) {
+				remove(parent, prop, index);
+			}
+
+			const skipped = should_skip;
+			const removed = should_remove;
+
+			should_skip = _should_skip;
+			should_remove = _should_remove;
+			replacement = _replacement;
+
+			if (skipped) return node;
+			if (removed) return null;
+		}
+
+		for (const key in node) {
+			const value = (node )[key];
+
+			if (typeof value !== 'object') {
+				continue;
+			}
+
+			else if (Array.isArray(value)) {
+				for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
+					if (value[j] !== null && typeof value[j].type === 'string') {
+						if (!visit(value[j], node, enter, leave, key, k)) {
+							// removed
+							j--;
+						}
+					}
+				}
+			}
+
+			else if (value !== null && typeof value.type === 'string') {
+				visit(value, node, enter, leave, key, null);
+			}
+		}
+
+		if (leave) {
+			const _replacement = replacement;
+			const _should_remove = should_remove;
+			replacement = null;
+			should_remove = false;
+
+			leave.call(context, node, parent, prop, index);
+
+			if (replacement) {
+				node = replacement;
+				replace(parent, prop, index, node);
+			}
+
+			if (should_remove) {
+				remove(parent, prop, index);
+			}
+
+			const removed = should_remove;
+
+			replacement = _replacement;
+			should_remove = _should_remove;
+
+			if (removed) return null;
+		}
+	}
+
+	return node;
+}
+
+export { walk };
Index: frontend/node_modules/estree-walker/src/index.ts
===================================================================
--- frontend/node_modules/estree-walker/src/index.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/src/index.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,144 @@
+import { BaseNode } from "estree";
+
+type WalkerContext = {
+	skip: () => void;
+	remove: () => void;
+	replace: (node: BaseNode) => void;
+};
+
+type WalkerHandler = (
+	this: WalkerContext,
+	node: BaseNode,
+	parent: BaseNode,
+	key: string,
+	index: number
+) => void
+
+type Walker = {
+	enter?: WalkerHandler;
+	leave?: WalkerHandler;
+}
+
+export function walk(ast: BaseNode, { enter, leave }: Walker) {
+	return visit(ast, null, enter, leave);
+}
+
+let should_skip = false;
+let should_remove = false;
+let replacement: BaseNode = null;
+const context: WalkerContext = {
+	skip: () => should_skip = true,
+	remove: () => should_remove = true,
+	replace: (node: BaseNode) => replacement = node
+};
+
+function replace(parent: any, prop: string, index: number, node: BaseNode) {
+	if (parent) {
+		if (index !== null) {
+			parent[prop][index] = node;
+		} else {
+			parent[prop] = node;
+		}
+	}
+}
+
+function remove(parent: any, prop: string, index: number) {
+	if (parent) {
+		if (index !== null) {
+			parent[prop].splice(index, 1);
+		} else {
+			delete parent[prop];
+		}
+	}
+}
+
+function visit(
+	node: BaseNode,
+	parent: BaseNode,
+	enter: WalkerHandler,
+	leave: WalkerHandler,
+	prop?: string,
+	index?: number
+) {
+	if (node) {
+		if (enter) {
+			const _should_skip = should_skip;
+			const _should_remove = should_remove;
+			const _replacement = replacement;
+			should_skip = false;
+			should_remove = false;
+			replacement = null;
+
+			enter.call(context, node, parent, prop, index);
+
+			if (replacement) {
+				node = replacement;
+				replace(parent, prop, index, node);
+			}
+
+			if (should_remove) {
+				remove(parent, prop, index);
+			}
+
+			const skipped = should_skip;
+			const removed = should_remove;
+
+			should_skip = _should_skip;
+			should_remove = _should_remove;
+			replacement = _replacement;
+
+			if (skipped) return node;
+			if (removed) return null;
+		}
+
+		for (const key in node) {
+			const value = (node as any)[key];
+
+			if (typeof value !== 'object') {
+				continue;
+			}
+
+			else if (Array.isArray(value)) {
+				for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
+					if (value[j] !== null && typeof value[j].type === 'string') {
+						if (!visit(value[j], node, enter, leave, key, k)) {
+							// removed
+							j--;
+						}
+					}
+				}
+			}
+
+			else if (value !== null && typeof value.type === 'string') {
+				visit(value, node, enter, leave, key, null);
+			}
+		}
+
+		if (leave) {
+			const _replacement = replacement;
+			const _should_remove = should_remove;
+			replacement = null;
+			should_remove = false;
+
+			leave.call(context, node, parent, prop, index);
+
+			if (replacement) {
+				node = replacement;
+				replace(parent, prop, index, node);
+			}
+
+			if (should_remove) {
+				remove(parent, prop, index);
+			}
+
+			const removed = should_remove;
+
+			replacement = _replacement;
+			should_remove = _should_remove;
+
+			if (removed) return null;
+		}
+	}
+
+	return node;
+}
Index: frontend/node_modules/estree-walker/types/index.d.ts
===================================================================
--- frontend/node_modules/estree-walker/types/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/estree-walker/types/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+import { BaseNode } from "estree";
+declare type WalkerContext = {
+    skip: () => void;
+    remove: () => void;
+    replace: (node: BaseNode) => void;
+};
+declare type WalkerHandler = (this: WalkerContext, node: BaseNode, parent: BaseNode, key: string, index: number) => void;
+declare type Walker = {
+    enter?: WalkerHandler;
+    leave?: WalkerHandler;
+};
+export declare function walk(ast: BaseNode, { enter, leave }: Walker): BaseNode;
+export {};
