Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/es-abstract/.editorconfig b/node_modules/es-abstract/.editorconfig
new file mode 100644
index 0000000..eaa2141
--- /dev/null
+++ b/node_modules/es-abstract/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/es-abstract/.eslintignore b/node_modules/es-abstract/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/node_modules/es-abstract/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/node_modules/es-abstract/.eslintrc b/node_modules/es-abstract/.eslintrc
new file mode 100644
index 0000000..354fb6e
--- /dev/null
+++ b/node_modules/es-abstract/.eslintrc
@@ -0,0 +1,66 @@
+{
+	"root": true,
+
+	"extends": "@ljharb",
+
+	"env": {
+		"es6": true,
+	},
+
+	"rules": {
+		"array-bracket-newline": 0,
+		"array-element-newline": 0,
+		"complexity": 0,
+		"eqeqeq": [2, "allow-null"],
+		"func-name-matching": 0,
+		"id-length": [2, { "min": 1, "max": 40 }],
+		"max-params": [2, 4],
+		"max-statements-per-line": [2, { "max": 2 }],
+		"multiline-comment-style": 0,
+		"no-magic-numbers": 0,
+		"new-cap": 0,
+		"no-extra-parens": 1,
+		"operator-linebreak": [2, "before"],
+		"sort-keys": 0,
+	},
+
+	"overrides": [
+		{
+			"files": "GetIntrinsic.js",
+			"rules": {
+				"max-statements": 0,
+			}
+		},
+		{
+			"files": "operations/*",
+			"rules": {
+				"max-lines": 0,
+			},
+		},
+		{
+			"files": [
+				"operations/deltas.js",
+				"operations/getOps.js",
+				"operations/spackle.js",
+				"operations/years.js",
+			],
+			"extends": "@ljharb/eslint-config/node/latest",
+			"rules": {
+				"func-style": 0,
+				"max-lines-per-function": 0,
+				"max-nested-callbacks": 0,
+				"no-throw-literal": 0,
+			},
+		},
+		{
+			"files": "test/**",
+			"extends": "@ljharb/eslint-config/tests",
+			"rules": {
+				"id-length": 0,
+				"max-lines-per-function": 0,
+				"no-implicit-coercion": 0,
+				"no-invalid-this": 1,
+			},
+		},
+	],
+}
diff --git a/node_modules/es-abstract/.gitattributes b/node_modules/es-abstract/.gitattributes
new file mode 100644
index 0000000..7038b35
--- /dev/null
+++ b/node_modules/es-abstract/.gitattributes
@@ -0,0 +1,626 @@
+2015/AbstractRelationalComparison.js	spackled linguist-generated=true
+2015/DateFromTime.js	spackled linguist-generated=true
+2015/Day.js	spackled linguist-generated=true
+2015/DayFromYear.js	spackled linguist-generated=true
+2015/DayWithinYear.js	spackled linguist-generated=true
+2015/DaysInYear.js	spackled linguist-generated=true
+2015/HourFromTime.js	spackled linguist-generated=true
+2015/InLeapYear.js	spackled linguist-generated=true
+2015/IsCallable.js	spackled linguist-generated=true
+2015/IsPropertyDescriptor.js	spackled linguist-generated=true
+2015/MakeDate.js	spackled linguist-generated=true
+2015/MakeDay.js	spackled linguist-generated=true
+2015/MakeTime.js	spackled linguist-generated=true
+2015/MinFromTime.js	spackled linguist-generated=true
+2015/MonthFromTime.js	spackled linguist-generated=true
+2015/SameValue.js	spackled linguist-generated=true
+2015/SecFromTime.js	spackled linguist-generated=true
+2015/StrictEqualityComparison.js	spackled linguist-generated=true
+2015/TimeClip.js	spackled linguist-generated=true
+2015/TimeFromYear.js	spackled linguist-generated=true
+2015/TimeWithinDay.js	spackled linguist-generated=true
+2015/ToBoolean.js	spackled linguist-generated=true
+2015/ToInt32.js	spackled linguist-generated=true
+2015/ToPropertyDescriptor.js	spackled linguist-generated=true
+2015/ToUint16.js	spackled linguist-generated=true
+2015/ToUint32.js	spackled linguist-generated=true
+2015/WeekDay.js	spackled linguist-generated=true
+2015/YearFromTime.js	spackled linguist-generated=true
+2015/abs.js	spackled linguist-generated=true
+2015/floor.js	spackled linguist-generated=true
+2015/modulo.js	spackled linguist-generated=true
+2015/msFromTime.js	spackled linguist-generated=true
+2016/AbstractEqualityComparison.js	spackled linguist-generated=true
+2016/AbstractRelationalComparison.js	spackled linguist-generated=true
+2016/AdvanceStringIndex.js	spackled linguist-generated=true
+2016/ArrayCreate.js	spackled linguist-generated=true
+2016/ArraySetLength.js	spackled linguist-generated=true
+2016/ArraySpeciesCreate.js	spackled linguist-generated=true
+2016/Call.js	spackled linguist-generated=true
+2016/CanonicalNumericIndexString.js	spackled linguist-generated=true
+2016/CompletePropertyDescriptor.js	spackled linguist-generated=true
+2016/CreateDataProperty.js	spackled linguist-generated=true
+2016/CreateDataPropertyOrThrow.js	spackled linguist-generated=true
+2016/CreateHTML.js	spackled linguist-generated=true
+2016/CreateIterResultObject.js	spackled linguist-generated=true
+2016/CreateListFromArrayLike.js	spackled linguist-generated=true
+2016/CreateMethodProperty.js	spackled linguist-generated=true
+2016/DateFromTime.js	spackled linguist-generated=true
+2016/Day.js	spackled linguist-generated=true
+2016/DayFromYear.js	spackled linguist-generated=true
+2016/DayWithinYear.js	spackled linguist-generated=true
+2016/DaysInYear.js	spackled linguist-generated=true
+2016/DefinePropertyOrThrow.js	spackled linguist-generated=true
+2016/DeletePropertyOrThrow.js	spackled linguist-generated=true
+2016/EnumerableOwnNames.js	spackled linguist-generated=true
+2016/FromPropertyDescriptor.js	spackled linguist-generated=true
+2016/Get.js	spackled linguist-generated=true
+2016/GetIterator.js	spackled linguist-generated=true
+2016/GetMethod.js	spackled linguist-generated=true
+2016/GetOwnPropertyKeys.js	spackled linguist-generated=true
+2016/GetPrototypeFromConstructor.js	spackled linguist-generated=true
+2016/GetSubstitution.js	spackled linguist-generated=true
+2016/GetV.js	spackled linguist-generated=true
+2016/HasOwnProperty.js	spackled linguist-generated=true
+2016/HasProperty.js	spackled linguist-generated=true
+2016/HourFromTime.js	spackled linguist-generated=true
+2016/InLeapYear.js	spackled linguist-generated=true
+2016/InstanceofOperator.js	spackled linguist-generated=true
+2016/Invoke.js	spackled linguist-generated=true
+2016/IsAccessorDescriptor.js	spackled linguist-generated=true
+2016/IsArray.js	spackled linguist-generated=true
+2016/IsCallable.js	spackled linguist-generated=true
+2016/IsConcatSpreadable.js	spackled linguist-generated=true
+2016/IsConstructor.js	spackled linguist-generated=true
+2016/IsDataDescriptor.js	spackled linguist-generated=true
+2016/IsExtensible.js	spackled linguist-generated=true
+2016/IsGenericDescriptor.js	spackled linguist-generated=true
+2016/IsInteger.js	spackled linguist-generated=true
+2016/IsPromise.js	spackled linguist-generated=true
+2016/IsPropertyDescriptor.js	spackled linguist-generated=true
+2016/IsPropertyKey.js	spackled linguist-generated=true
+2016/IsRegExp.js	spackled linguist-generated=true
+2016/IteratorClose.js	spackled linguist-generated=true
+2016/IteratorComplete.js	spackled linguist-generated=true
+2016/IteratorNext.js	spackled linguist-generated=true
+2016/IteratorStep.js	spackled linguist-generated=true
+2016/IteratorValue.js	spackled linguist-generated=true
+2016/MakeDate.js	spackled linguist-generated=true
+2016/MakeDay.js	spackled linguist-generated=true
+2016/MakeTime.js	spackled linguist-generated=true
+2016/MinFromTime.js	spackled linguist-generated=true
+2016/MonthFromTime.js	spackled linguist-generated=true
+2016/ObjectCreate.js	spackled linguist-generated=true
+2016/OrdinaryCreateFromConstructor.js	spackled linguist-generated=true
+2016/OrdinaryDefineOwnProperty.js	spackled linguist-generated=true
+2016/OrdinaryGetOwnProperty.js	spackled linguist-generated=true
+2016/OrdinaryHasInstance.js	spackled linguist-generated=true
+2016/OrdinaryHasProperty.js	spackled linguist-generated=true
+2016/QuoteJSONString.js	spackled linguist-generated=true
+2016/RegExpCreate.js	spackled linguist-generated=true
+2016/RegExpExec.js	spackled linguist-generated=true
+2016/RequireObjectCoercible.js	spackled linguist-generated=true
+2016/SameValue.js	spackled linguist-generated=true
+2016/SameValueZero.js	spackled linguist-generated=true
+2016/SecFromTime.js	spackled linguist-generated=true
+2016/Set.js	spackled linguist-generated=true
+2016/SetFunctionName.js	spackled linguist-generated=true
+2016/SetIntegrityLevel.js	spackled linguist-generated=true
+2016/SpeciesConstructor.js	spackled linguist-generated=true
+2016/SplitMatch.js	spackled linguist-generated=true
+2016/StrictEqualityComparison.js	spackled linguist-generated=true
+2016/StringCreate.js	spackled linguist-generated=true
+2016/SymbolDescriptiveString.js	spackled linguist-generated=true
+2016/TestIntegrityLevel.js	spackled linguist-generated=true
+2016/TimeClip.js	spackled linguist-generated=true
+2016/TimeFromYear.js	spackled linguist-generated=true
+2016/TimeWithinDay.js	spackled linguist-generated=true
+2016/ToBoolean.js	spackled linguist-generated=true
+2016/ToDateString.js	spackled linguist-generated=true
+2016/ToInt16.js	spackled linguist-generated=true
+2016/ToInt32.js	spackled linguist-generated=true
+2016/ToInt8.js	spackled linguist-generated=true
+2016/ToInteger.js	spackled linguist-generated=true
+2016/ToLength.js	spackled linguist-generated=true
+2016/ToNumber.js	spackled linguist-generated=true
+2016/ToObject.js	spackled linguist-generated=true
+2016/ToPrimitive.js	spackled linguist-generated=true
+2016/ToPropertyDescriptor.js	spackled linguist-generated=true
+2016/ToPropertyKey.js	spackled linguist-generated=true
+2016/ToString.js	spackled linguist-generated=true
+2016/ToUint16.js	spackled linguist-generated=true
+2016/ToUint32.js	spackled linguist-generated=true
+2016/ToUint8.js	spackled linguist-generated=true
+2016/ToUint8Clamp.js	spackled linguist-generated=true
+2016/Type.js	spackled linguist-generated=true
+2016/ValidateAndApplyPropertyDescriptor.js	spackled linguist-generated=true
+2016/WeekDay.js	spackled linguist-generated=true
+2016/YearFromTime.js	spackled linguist-generated=true
+2016/abs.js	spackled linguist-generated=true
+2016/floor.js	spackled linguist-generated=true
+2016/modulo.js	spackled linguist-generated=true
+2016/msFromTime.js	spackled linguist-generated=true
+2016/thisBooleanValue.js	spackled linguist-generated=true
+2016/thisNumberValue.js	spackled linguist-generated=true
+2016/thisStringValue.js	spackled linguist-generated=true
+2016/thisTimeValue.js	spackled linguist-generated=true
+2017/AbstractEqualityComparison.js	spackled linguist-generated=true
+2017/AbstractRelationalComparison.js	spackled linguist-generated=true
+2017/AdvanceStringIndex.js	spackled linguist-generated=true
+2017/ArrayCreate.js	spackled linguist-generated=true
+2017/ArraySetLength.js	spackled linguist-generated=true
+2017/ArraySpeciesCreate.js	spackled linguist-generated=true
+2017/Call.js	spackled linguist-generated=true
+2017/CanonicalNumericIndexString.js	spackled linguist-generated=true
+2017/CompletePropertyDescriptor.js	spackled linguist-generated=true
+2017/CreateDataProperty.js	spackled linguist-generated=true
+2017/CreateDataPropertyOrThrow.js	spackled linguist-generated=true
+2017/CreateHTML.js	spackled linguist-generated=true
+2017/CreateIterResultObject.js	spackled linguist-generated=true
+2017/CreateListFromArrayLike.js	spackled linguist-generated=true
+2017/CreateMethodProperty.js	spackled linguist-generated=true
+2017/DateFromTime.js	spackled linguist-generated=true
+2017/Day.js	spackled linguist-generated=true
+2017/DayFromYear.js	spackled linguist-generated=true
+2017/DayWithinYear.js	spackled linguist-generated=true
+2017/DaysInYear.js	spackled linguist-generated=true
+2017/DefinePropertyOrThrow.js	spackled linguist-generated=true
+2017/DeletePropertyOrThrow.js	spackled linguist-generated=true
+2017/FromPropertyDescriptor.js	spackled linguist-generated=true
+2017/Get.js	spackled linguist-generated=true
+2017/GetIterator.js	spackled linguist-generated=true
+2017/GetMethod.js	spackled linguist-generated=true
+2017/GetOwnPropertyKeys.js	spackled linguist-generated=true
+2017/GetPrototypeFromConstructor.js	spackled linguist-generated=true
+2017/GetSubstitution.js	spackled linguist-generated=true
+2017/GetV.js	spackled linguist-generated=true
+2017/HasOwnProperty.js	spackled linguist-generated=true
+2017/HasProperty.js	spackled linguist-generated=true
+2017/HourFromTime.js	spackled linguist-generated=true
+2017/InLeapYear.js	spackled linguist-generated=true
+2017/InstanceofOperator.js	spackled linguist-generated=true
+2017/Invoke.js	spackled linguist-generated=true
+2017/IsAccessorDescriptor.js	spackled linguist-generated=true
+2017/IsArray.js	spackled linguist-generated=true
+2017/IsCallable.js	spackled linguist-generated=true
+2017/IsConcatSpreadable.js	spackled linguist-generated=true
+2017/IsConstructor.js	spackled linguist-generated=true
+2017/IsDataDescriptor.js	spackled linguist-generated=true
+2017/IsExtensible.js	spackled linguist-generated=true
+2017/IsGenericDescriptor.js	spackled linguist-generated=true
+2017/IsInteger.js	spackled linguist-generated=true
+2017/IsPromise.js	spackled linguist-generated=true
+2017/IsPropertyDescriptor.js	spackled linguist-generated=true
+2017/IsPropertyKey.js	spackled linguist-generated=true
+2017/IsRegExp.js	spackled linguist-generated=true
+2017/IteratorClose.js	spackled linguist-generated=true
+2017/IteratorComplete.js	spackled linguist-generated=true
+2017/IteratorNext.js	spackled linguist-generated=true
+2017/IteratorStep.js	spackled linguist-generated=true
+2017/IteratorValue.js	spackled linguist-generated=true
+2017/MakeDate.js	spackled linguist-generated=true
+2017/MakeDay.js	spackled linguist-generated=true
+2017/MakeTime.js	spackled linguist-generated=true
+2017/MinFromTime.js	spackled linguist-generated=true
+2017/MonthFromTime.js	spackled linguist-generated=true
+2017/ObjectCreate.js	spackled linguist-generated=true
+2017/OrdinaryCreateFromConstructor.js	spackled linguist-generated=true
+2017/OrdinaryDefineOwnProperty.js	spackled linguist-generated=true
+2017/OrdinaryGetOwnProperty.js	spackled linguist-generated=true
+2017/OrdinaryGetPrototypeOf.js	spackled linguist-generated=true
+2017/OrdinaryHasInstance.js	spackled linguist-generated=true
+2017/OrdinaryHasProperty.js	spackled linguist-generated=true
+2017/OrdinarySetPrototypeOf.js	spackled linguist-generated=true
+2017/QuoteJSONString.js	spackled linguist-generated=true
+2017/RegExpCreate.js	spackled linguist-generated=true
+2017/RegExpExec.js	spackled linguist-generated=true
+2017/RequireObjectCoercible.js	spackled linguist-generated=true
+2017/SameValue.js	spackled linguist-generated=true
+2017/SameValueNonNumber.js	spackled linguist-generated=true
+2017/SameValueZero.js	spackled linguist-generated=true
+2017/SecFromTime.js	spackled linguist-generated=true
+2017/Set.js	spackled linguist-generated=true
+2017/SetFunctionName.js	spackled linguist-generated=true
+2017/SetIntegrityLevel.js	spackled linguist-generated=true
+2017/SpeciesConstructor.js	spackled linguist-generated=true
+2017/SplitMatch.js	spackled linguist-generated=true
+2017/StrictEqualityComparison.js	spackled linguist-generated=true
+2017/StringCreate.js	spackled linguist-generated=true
+2017/SymbolDescriptiveString.js	spackled linguist-generated=true
+2017/TestIntegrityLevel.js	spackled linguist-generated=true
+2017/TimeClip.js	spackled linguist-generated=true
+2017/TimeFromYear.js	spackled linguist-generated=true
+2017/TimeWithinDay.js	spackled linguist-generated=true
+2017/ToBoolean.js	spackled linguist-generated=true
+2017/ToDateString.js	spackled linguist-generated=true
+2017/ToInt16.js	spackled linguist-generated=true
+2017/ToInt32.js	spackled linguist-generated=true
+2017/ToInt8.js	spackled linguist-generated=true
+2017/ToInteger.js	spackled linguist-generated=true
+2017/ToLength.js	spackled linguist-generated=true
+2017/ToNumber.js	spackled linguist-generated=true
+2017/ToObject.js	spackled linguist-generated=true
+2017/ToPrimitive.js	spackled linguist-generated=true
+2017/ToPropertyDescriptor.js	spackled linguist-generated=true
+2017/ToPropertyKey.js	spackled linguist-generated=true
+2017/ToString.js	spackled linguist-generated=true
+2017/ToUint16.js	spackled linguist-generated=true
+2017/ToUint32.js	spackled linguist-generated=true
+2017/ToUint8.js	spackled linguist-generated=true
+2017/ToUint8Clamp.js	spackled linguist-generated=true
+2017/Type.js	spackled linguist-generated=true
+2017/UTF16Decode.js	spackled linguist-generated=true
+2017/UTF16Encoding.js	spackled linguist-generated=true
+2017/ValidateAndApplyPropertyDescriptor.js	spackled linguist-generated=true
+2017/WeekDay.js	spackled linguist-generated=true
+2017/YearFromTime.js	spackled linguist-generated=true
+2017/abs.js	spackled linguist-generated=true
+2017/floor.js	spackled linguist-generated=true
+2017/modulo.js	spackled linguist-generated=true
+2017/msFromTime.js	spackled linguist-generated=true
+2017/thisBooleanValue.js	spackled linguist-generated=true
+2017/thisNumberValue.js	spackled linguist-generated=true
+2017/thisStringValue.js	spackled linguist-generated=true
+2017/thisTimeValue.js	spackled linguist-generated=true
+2018/AbstractEqualityComparison.js	spackled linguist-generated=true
+2018/AbstractRelationalComparison.js	spackled linguist-generated=true
+2018/AdvanceStringIndex.js	spackled linguist-generated=true
+2018/ArrayCreate.js	spackled linguist-generated=true
+2018/ArraySetLength.js	spackled linguist-generated=true
+2018/ArraySpeciesCreate.js	spackled linguist-generated=true
+2018/Call.js	spackled linguist-generated=true
+2018/CanonicalNumericIndexString.js	spackled linguist-generated=true
+2018/CompletePropertyDescriptor.js	spackled linguist-generated=true
+2018/CreateDataProperty.js	spackled linguist-generated=true
+2018/CreateDataPropertyOrThrow.js	spackled linguist-generated=true
+2018/CreateHTML.js	spackled linguist-generated=true
+2018/CreateIterResultObject.js	spackled linguist-generated=true
+2018/CreateListFromArrayLike.js	spackled linguist-generated=true
+2018/CreateMethodProperty.js	spackled linguist-generated=true
+2018/DateFromTime.js	spackled linguist-generated=true
+2018/Day.js	spackled linguist-generated=true
+2018/DayFromYear.js	spackled linguist-generated=true
+2018/DayWithinYear.js	spackled linguist-generated=true
+2018/DaysInYear.js	spackled linguist-generated=true
+2018/DefinePropertyOrThrow.js	spackled linguist-generated=true
+2018/DeletePropertyOrThrow.js	spackled linguist-generated=true
+2018/FromPropertyDescriptor.js	spackled linguist-generated=true
+2018/Get.js	spackled linguist-generated=true
+2018/GetIterator.js	spackled linguist-generated=true
+2018/GetMethod.js	spackled linguist-generated=true
+2018/GetOwnPropertyKeys.js	spackled linguist-generated=true
+2018/GetPrototypeFromConstructor.js	spackled linguist-generated=true
+2018/GetV.js	spackled linguist-generated=true
+2018/HasOwnProperty.js	spackled linguist-generated=true
+2018/HasProperty.js	spackled linguist-generated=true
+2018/HourFromTime.js	spackled linguist-generated=true
+2018/InLeapYear.js	spackled linguist-generated=true
+2018/InstanceofOperator.js	spackled linguist-generated=true
+2018/Invoke.js	spackled linguist-generated=true
+2018/IsAccessorDescriptor.js	spackled linguist-generated=true
+2018/IsArray.js	spackled linguist-generated=true
+2018/IsCallable.js	spackled linguist-generated=true
+2018/IsConcatSpreadable.js	spackled linguist-generated=true
+2018/IsConstructor.js	spackled linguist-generated=true
+2018/IsDataDescriptor.js	spackled linguist-generated=true
+2018/IsExtensible.js	spackled linguist-generated=true
+2018/IsGenericDescriptor.js	spackled linguist-generated=true
+2018/IsInteger.js	spackled linguist-generated=true
+2018/IsPromise.js	spackled linguist-generated=true
+2018/IsPropertyKey.js	spackled linguist-generated=true
+2018/IsRegExp.js	spackled linguist-generated=true
+2018/IterableToList.js	spackled linguist-generated=true
+2018/IteratorClose.js	spackled linguist-generated=true
+2018/IteratorComplete.js	spackled linguist-generated=true
+2018/IteratorNext.js	spackled linguist-generated=true
+2018/IteratorStep.js	spackled linguist-generated=true
+2018/IteratorValue.js	spackled linguist-generated=true
+2018/MakeDate.js	spackled linguist-generated=true
+2018/MakeDay.js	spackled linguist-generated=true
+2018/MakeTime.js	spackled linguist-generated=true
+2018/MinFromTime.js	spackled linguist-generated=true
+2018/MonthFromTime.js	spackled linguist-generated=true
+2018/ObjectCreate.js	spackled linguist-generated=true
+2018/OrdinaryCreateFromConstructor.js	spackled linguist-generated=true
+2018/OrdinaryDefineOwnProperty.js	spackled linguist-generated=true
+2018/OrdinaryGetOwnProperty.js	spackled linguist-generated=true
+2018/OrdinaryGetPrototypeOf.js	spackled linguist-generated=true
+2018/OrdinaryHasInstance.js	spackled linguist-generated=true
+2018/OrdinaryHasProperty.js	spackled linguist-generated=true
+2018/OrdinarySetPrototypeOf.js	spackled linguist-generated=true
+2018/RegExpCreate.js	spackled linguist-generated=true
+2018/RegExpExec.js	spackled linguist-generated=true
+2018/RequireObjectCoercible.js	spackled linguist-generated=true
+2018/SameValue.js	spackled linguist-generated=true
+2018/SameValueNonNumber.js	spackled linguist-generated=true
+2018/SameValueZero.js	spackled linguist-generated=true
+2018/SecFromTime.js	spackled linguist-generated=true
+2018/Set.js	spackled linguist-generated=true
+2018/SetFunctionName.js	spackled linguist-generated=true
+2018/SetIntegrityLevel.js	spackled linguist-generated=true
+2018/SpeciesConstructor.js	spackled linguist-generated=true
+2018/SplitMatch.js	spackled linguist-generated=true
+2018/StrictEqualityComparison.js	spackled linguist-generated=true
+2018/StringCreate.js	spackled linguist-generated=true
+2018/StringGetOwnProperty.js	spackled linguist-generated=true
+2018/SymbolDescriptiveString.js	spackled linguist-generated=true
+2018/TestIntegrityLevel.js	spackled linguist-generated=true
+2018/TimeClip.js	spackled linguist-generated=true
+2018/TimeFromYear.js	spackled linguist-generated=true
+2018/TimeWithinDay.js	spackled linguist-generated=true
+2018/ToBoolean.js	spackled linguist-generated=true
+2018/ToDateString.js	spackled linguist-generated=true
+2018/ToIndex.js	spackled linguist-generated=true
+2018/ToInt16.js	spackled linguist-generated=true
+2018/ToInt32.js	spackled linguist-generated=true
+2018/ToInt8.js	spackled linguist-generated=true
+2018/ToInteger.js	spackled linguist-generated=true
+2018/ToLength.js	spackled linguist-generated=true
+2018/ToNumber.js	spackled linguist-generated=true
+2018/ToObject.js	spackled linguist-generated=true
+2018/ToPrimitive.js	spackled linguist-generated=true
+2018/ToPropertyDescriptor.js	spackled linguist-generated=true
+2018/ToPropertyKey.js	spackled linguist-generated=true
+2018/ToString.js	spackled linguist-generated=true
+2018/ToUint16.js	spackled linguist-generated=true
+2018/ToUint32.js	spackled linguist-generated=true
+2018/ToUint8.js	spackled linguist-generated=true
+2018/ToUint8Clamp.js	spackled linguist-generated=true
+2018/Type.js	spackled linguist-generated=true
+2018/UTF16Decode.js	spackled linguist-generated=true
+2018/UTF16Encoding.js	spackled linguist-generated=true
+2018/ValidateAndApplyPropertyDescriptor.js	spackled linguist-generated=true
+2018/WeekDay.js	spackled linguist-generated=true
+2018/YearFromTime.js	spackled linguist-generated=true
+2018/abs.js	spackled linguist-generated=true
+2018/floor.js	spackled linguist-generated=true
+2018/modulo.js	spackled linguist-generated=true
+2018/msFromTime.js	spackled linguist-generated=true
+2018/thisBooleanValue.js	spackled linguist-generated=true
+2018/thisNumberValue.js	spackled linguist-generated=true
+2018/thisStringValue.js	spackled linguist-generated=true
+2018/thisTimeValue.js	spackled linguist-generated=true
+2019/AbstractEqualityComparison.js	spackled linguist-generated=true
+2019/AbstractRelationalComparison.js	spackled linguist-generated=true
+2019/AdvanceStringIndex.js	spackled linguist-generated=true
+2019/ArrayCreate.js	spackled linguist-generated=true
+2019/ArraySetLength.js	spackled linguist-generated=true
+2019/ArraySpeciesCreate.js	spackled linguist-generated=true
+2019/Call.js	spackled linguist-generated=true
+2019/CanonicalNumericIndexString.js	spackled linguist-generated=true
+2019/CompletePropertyDescriptor.js	spackled linguist-generated=true
+2019/CopyDataProperties.js	spackled linguist-generated=true
+2019/CreateDataProperty.js	spackled linguist-generated=true
+2019/CreateDataPropertyOrThrow.js	spackled linguist-generated=true
+2019/CreateHTML.js	spackled linguist-generated=true
+2019/CreateIterResultObject.js	spackled linguist-generated=true
+2019/CreateListFromArrayLike.js	spackled linguist-generated=true
+2019/CreateMethodProperty.js	spackled linguist-generated=true
+2019/DateFromTime.js	spackled linguist-generated=true
+2019/DateString.js	spackled linguist-generated=true
+2019/Day.js	spackled linguist-generated=true
+2019/DayFromYear.js	spackled linguist-generated=true
+2019/DayWithinYear.js	spackled linguist-generated=true
+2019/DaysInYear.js	spackled linguist-generated=true
+2019/DefinePropertyOrThrow.js	spackled linguist-generated=true
+2019/DeletePropertyOrThrow.js	spackled linguist-generated=true
+2019/EnumerableOwnPropertyNames.js	spackled linguist-generated=true
+2019/FromPropertyDescriptor.js	spackled linguist-generated=true
+2019/Get.js	spackled linguist-generated=true
+2019/GetIterator.js	spackled linguist-generated=true
+2019/GetMethod.js	spackled linguist-generated=true
+2019/GetOwnPropertyKeys.js	spackled linguist-generated=true
+2019/GetPrototypeFromConstructor.js	spackled linguist-generated=true
+2019/GetSubstitution.js	spackled linguist-generated=true
+2019/GetV.js	spackled linguist-generated=true
+2019/HasOwnProperty.js	spackled linguist-generated=true
+2019/HasProperty.js	spackled linguist-generated=true
+2019/HourFromTime.js	spackled linguist-generated=true
+2019/InLeapYear.js	spackled linguist-generated=true
+2019/InstanceofOperator.js	spackled linguist-generated=true
+2019/Invoke.js	spackled linguist-generated=true
+2019/IsAccessorDescriptor.js	spackled linguist-generated=true
+2019/IsArray.js	spackled linguist-generated=true
+2019/IsCallable.js	spackled linguist-generated=true
+2019/IsConcatSpreadable.js	spackled linguist-generated=true
+2019/IsConstructor.js	spackled linguist-generated=true
+2019/IsDataDescriptor.js	spackled linguist-generated=true
+2019/IsExtensible.js	spackled linguist-generated=true
+2019/IsGenericDescriptor.js	spackled linguist-generated=true
+2019/IsInteger.js	spackled linguist-generated=true
+2019/IsPromise.js	spackled linguist-generated=true
+2019/IsPropertyKey.js	spackled linguist-generated=true
+2019/IsRegExp.js	spackled linguist-generated=true
+2019/IsStringPrefix.js	spackled linguist-generated=true
+2019/IterableToList.js	spackled linguist-generated=true
+2019/IteratorClose.js	spackled linguist-generated=true
+2019/IteratorComplete.js	spackled linguist-generated=true
+2019/IteratorNext.js	spackled linguist-generated=true
+2019/IteratorStep.js	spackled linguist-generated=true
+2019/IteratorValue.js	spackled linguist-generated=true
+2019/MakeDate.js	spackled linguist-generated=true
+2019/MakeDay.js	spackled linguist-generated=true
+2019/MakeTime.js	spackled linguist-generated=true
+2019/MinFromTime.js	spackled linguist-generated=true
+2019/MonthFromTime.js	spackled linguist-generated=true
+2019/NumberToString.js	spackled linguist-generated=true
+2019/ObjectCreate.js	spackled linguist-generated=true
+2019/OrdinaryCreateFromConstructor.js	spackled linguist-generated=true
+2019/OrdinaryDefineOwnProperty.js	spackled linguist-generated=true
+2019/OrdinaryGetOwnProperty.js	spackled linguist-generated=true
+2019/OrdinaryGetPrototypeOf.js	spackled linguist-generated=true
+2019/OrdinaryHasInstance.js	spackled linguist-generated=true
+2019/OrdinaryHasProperty.js	spackled linguist-generated=true
+2019/OrdinarySetPrototypeOf.js	spackled linguist-generated=true
+2019/PromiseResolve.js	spackled linguist-generated=true
+2019/RegExpCreate.js	spackled linguist-generated=true
+2019/RegExpExec.js	spackled linguist-generated=true
+2019/RequireObjectCoercible.js	spackled linguist-generated=true
+2019/SameValue.js	spackled linguist-generated=true
+2019/SameValueNonNumber.js	spackled linguist-generated=true
+2019/SameValueZero.js	spackled linguist-generated=true
+2019/SecFromTime.js	spackled linguist-generated=true
+2019/Set.js	spackled linguist-generated=true
+2019/SetFunctionLength.js	spackled linguist-generated=true
+2019/SetFunctionName.js	spackled linguist-generated=true
+2019/SetIntegrityLevel.js	spackled linguist-generated=true
+2019/SpeciesConstructor.js	spackled linguist-generated=true
+2019/SplitMatch.js	spackled linguist-generated=true
+2019/StrictEqualityComparison.js	spackled linguist-generated=true
+2019/StringCreate.js	spackled linguist-generated=true
+2019/StringGetOwnProperty.js	spackled linguist-generated=true
+2019/SymbolDescriptiveString.js	spackled linguist-generated=true
+2019/TestIntegrityLevel.js	spackled linguist-generated=true
+2019/TimeClip.js	spackled linguist-generated=true
+2019/TimeFromYear.js	spackled linguist-generated=true
+2019/TimeString.js	spackled linguist-generated=true
+2019/TimeWithinDay.js	spackled linguist-generated=true
+2019/ToBoolean.js	spackled linguist-generated=true
+2019/ToDateString.js	spackled linguist-generated=true
+2019/ToIndex.js	spackled linguist-generated=true
+2019/ToInt16.js	spackled linguist-generated=true
+2019/ToInt32.js	spackled linguist-generated=true
+2019/ToInt8.js	spackled linguist-generated=true
+2019/ToInteger.js	spackled linguist-generated=true
+2019/ToLength.js	spackled linguist-generated=true
+2019/ToNumber.js	spackled linguist-generated=true
+2019/ToObject.js	spackled linguist-generated=true
+2019/ToPrimitive.js	spackled linguist-generated=true
+2019/ToPropertyDescriptor.js	spackled linguist-generated=true
+2019/ToPropertyKey.js	spackled linguist-generated=true
+2019/ToString.js	spackled linguist-generated=true
+2019/ToUint16.js	spackled linguist-generated=true
+2019/ToUint32.js	spackled linguist-generated=true
+2019/ToUint8.js	spackled linguist-generated=true
+2019/ToUint8Clamp.js	spackled linguist-generated=true
+2019/Type.js	spackled linguist-generated=true
+2019/UTF16Decode.js	spackled linguist-generated=true
+2019/UTF16Encoding.js	spackled linguist-generated=true
+2019/UnicodeEscape.js	spackled linguist-generated=true
+2019/ValidateAndApplyPropertyDescriptor.js	spackled linguist-generated=true
+2019/WeekDay.js	spackled linguist-generated=true
+2019/YearFromTime.js	spackled linguist-generated=true
+2019/abs.js	spackled linguist-generated=true
+2019/floor.js	spackled linguist-generated=true
+2019/modulo.js	spackled linguist-generated=true
+2019/msFromTime.js	spackled linguist-generated=true
+2019/thisBooleanValue.js	spackled linguist-generated=true
+2019/thisNumberValue.js	spackled linguist-generated=true
+2019/thisStringValue.js	spackled linguist-generated=true
+2019/thisSymbolValue.js	spackled linguist-generated=true
+2020/AbstractEqualityComparison.js	spackled linguist-generated=true
+2020/AbstractRelationalComparison.js	spackled linguist-generated=true
+2020/AddEntriesFromIterable.js	spackled linguist-generated=true
+2020/ArrayCreate.js	spackled linguist-generated=true
+2020/ArraySetLength.js	spackled linguist-generated=true
+2020/ArraySpeciesCreate.js	spackled linguist-generated=true
+2020/Call.js	spackled linguist-generated=true
+2020/CanonicalNumericIndexString.js	spackled linguist-generated=true
+2020/CompletePropertyDescriptor.js	spackled linguist-generated=true
+2020/CreateDataProperty.js	spackled linguist-generated=true
+2020/CreateDataPropertyOrThrow.js	spackled linguist-generated=true
+2020/CreateHTML.js	spackled linguist-generated=true
+2020/CreateIterResultObject.js	spackled linguist-generated=true
+2020/CreateMethodProperty.js	spackled linguist-generated=true
+2020/DateFromTime.js	spackled linguist-generated=true
+2020/DateString.js	spackled linguist-generated=true
+2020/Day.js	spackled linguist-generated=true
+2020/DayFromYear.js	spackled linguist-generated=true
+2020/DayWithinYear.js	spackled linguist-generated=true
+2020/DaysInYear.js	spackled linguist-generated=true
+2020/DefinePropertyOrThrow.js	spackled linguist-generated=true
+2020/DeletePropertyOrThrow.js	spackled linguist-generated=true
+2020/EnumerableOwnPropertyNames.js	spackled linguist-generated=true
+2020/FromPropertyDescriptor.js	spackled linguist-generated=true
+2020/Get.js	spackled linguist-generated=true
+2020/GetMethod.js	spackled linguist-generated=true
+2020/GetOwnPropertyKeys.js	spackled linguist-generated=true
+2020/GetPrototypeFromConstructor.js	spackled linguist-generated=true
+2020/GetSubstitution.js	spackled linguist-generated=true
+2020/GetV.js	spackled linguist-generated=true
+2020/HasOwnProperty.js	spackled linguist-generated=true
+2020/HasProperty.js	spackled linguist-generated=true
+2020/HourFromTime.js	spackled linguist-generated=true
+2020/InLeapYear.js	spackled linguist-generated=true
+2020/InstanceofOperator.js	spackled linguist-generated=true
+2020/Invoke.js	spackled linguist-generated=true
+2020/IsAccessorDescriptor.js	spackled linguist-generated=true
+2020/IsArray.js	spackled linguist-generated=true
+2020/IsCallable.js	spackled linguist-generated=true
+2020/IsConcatSpreadable.js	spackled linguist-generated=true
+2020/IsConstructor.js	spackled linguist-generated=true
+2020/IsDataDescriptor.js	spackled linguist-generated=true
+2020/IsExtensible.js	spackled linguist-generated=true
+2020/IsGenericDescriptor.js	spackled linguist-generated=true
+2020/IsInteger.js	spackled linguist-generated=true
+2020/IsPromise.js	spackled linguist-generated=true
+2020/IsPropertyKey.js	spackled linguist-generated=true
+2020/IsRegExp.js	spackled linguist-generated=true
+2020/IsStringPrefix.js	spackled linguist-generated=true
+2020/IteratorClose.js	spackled linguist-generated=true
+2020/IteratorComplete.js	spackled linguist-generated=true
+2020/IteratorNext.js	spackled linguist-generated=true
+2020/IteratorStep.js	spackled linguist-generated=true
+2020/IteratorValue.js	spackled linguist-generated=true
+2020/MakeDate.js	spackled linguist-generated=true
+2020/MakeDay.js	spackled linguist-generated=true
+2020/MakeTime.js	spackled linguist-generated=true
+2020/MinFromTime.js	spackled linguist-generated=true
+2020/MonthFromTime.js	spackled linguist-generated=true
+2020/OrdinaryDefineOwnProperty.js	spackled linguist-generated=true
+2020/OrdinaryGetOwnProperty.js	spackled linguist-generated=true
+2020/OrdinaryGetPrototypeOf.js	spackled linguist-generated=true
+2020/OrdinaryHasInstance.js	spackled linguist-generated=true
+2020/OrdinaryHasProperty.js	spackled linguist-generated=true
+2020/OrdinarySetPrototypeOf.js	spackled linguist-generated=true
+2020/PromiseResolve.js	spackled linguist-generated=true
+2020/RegExpCreate.js	spackled linguist-generated=true
+2020/RegExpExec.js	spackled linguist-generated=true
+2020/RequireObjectCoercible.js	spackled linguist-generated=true
+2020/SameValue.js	spackled linguist-generated=true
+2020/SameValueZero.js	spackled linguist-generated=true
+2020/SecFromTime.js	spackled linguist-generated=true
+2020/Set.js	spackled linguist-generated=true
+2020/SetFunctionName.js	spackled linguist-generated=true
+2020/SetIntegrityLevel.js	spackled linguist-generated=true
+2020/SpeciesConstructor.js	spackled linguist-generated=true
+2020/SplitMatch.js	spackled linguist-generated=true
+2020/StrictEqualityComparison.js	spackled linguist-generated=true
+2020/StringCreate.js	spackled linguist-generated=true
+2020/StringGetOwnProperty.js	spackled linguist-generated=true
+2020/SymbolDescriptiveString.js	spackled linguist-generated=true
+2020/TestIntegrityLevel.js	spackled linguist-generated=true
+2020/TimeClip.js	spackled linguist-generated=true
+2020/TimeFromYear.js	spackled linguist-generated=true
+2020/TimeString.js	spackled linguist-generated=true
+2020/TimeWithinDay.js	spackled linguist-generated=true
+2020/ToBoolean.js	spackled linguist-generated=true
+2020/ToDateString.js	spackled linguist-generated=true
+2020/ToInt16.js	spackled linguist-generated=true
+2020/ToInt32.js	spackled linguist-generated=true
+2020/ToInt8.js	spackled linguist-generated=true
+2020/ToLength.js	spackled linguist-generated=true
+2020/ToNumber.js	spackled linguist-generated=true
+2020/ToObject.js	spackled linguist-generated=true
+2020/ToPrimitive.js	spackled linguist-generated=true
+2020/ToPropertyDescriptor.js	spackled linguist-generated=true
+2020/ToPropertyKey.js	spackled linguist-generated=true
+2020/ToString.js	spackled linguist-generated=true
+2020/ToUint16.js	spackled linguist-generated=true
+2020/ToUint32.js	spackled linguist-generated=true
+2020/ToUint8.js	spackled linguist-generated=true
+2020/ToUint8Clamp.js	spackled linguist-generated=true
+2020/TrimString.js	spackled linguist-generated=true
+2020/UTF16Encoding.js	spackled linguist-generated=true
+2020/ValidateAndApplyPropertyDescriptor.js	spackled linguist-generated=true
+2020/WeekDay.js	spackled linguist-generated=true
+2020/YearFromTime.js	spackled linguist-generated=true
+2020/abs.js	spackled linguist-generated=true
+2020/floor.js	spackled linguist-generated=true
+2020/modulo.js	spackled linguist-generated=true
+2020/msFromTime.js	spackled linguist-generated=true
+2020/thisBooleanValue.js	spackled linguist-generated=true
+2020/thisNumberValue.js	spackled linguist-generated=true
+2020/thisStringValue.js	spackled linguist-generated=true
+2020/thisSymbolValue.js	spackled linguist-generated=true
+2020/thisTimeValue.js	spackled linguist-generated=true
\ No newline at end of file
diff --git a/node_modules/es-abstract/.nycrc b/node_modules/es-abstract/.nycrc
new file mode 100644
index 0000000..d316b4d
--- /dev/null
+++ b/node_modules/es-abstract/.nycrc
@@ -0,0 +1,14 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"lines": 86,
+	"statements": 85.93,
+	"functions": 82.43,
+	"branches": 76.06,
+	"exclude": [
+		"coverage",
+		"operations",
+		"test"
+	]
+}
diff --git a/node_modules/es-abstract/2015/AbstractEqualityComparison.js b/node_modules/es-abstract/2015/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2015/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2015/AbstractRelationalComparison.js b/node_modules/es-abstract/2015/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2015/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2015/AdvanceStringIndex.js b/node_modules/es-abstract/2015/AdvanceStringIndex.js
new file mode 100644
index 0000000..279602b
--- /dev/null
+++ b/node_modules/es-abstract/2015/AdvanceStringIndex.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+
+	var first = $charCodeAt(S, index);
+	if (!isLeadingSurrogate(first)) {
+		return index + 1;
+	}
+
+	var second = $charCodeAt(S, index + 1);
+	if (!isTrailingSurrogate(second)) {
+		return index + 1;
+	}
+
+	return index + 2;
+};
diff --git a/node_modules/es-abstract/2015/ArrayCreate.js b/node_modules/es-abstract/2015/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2015/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2015/ArraySetLength.js b/node_modules/es-abstract/2015/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2015/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/ArraySpeciesCreate.js b/node_modules/es-abstract/2015/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2015/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2015/Call.js b/node_modules/es-abstract/2015/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2015/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2015/CanonicalNumericIndexString.js b/node_modules/es-abstract/2015/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2015/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2015/CompletePropertyDescriptor.js b/node_modules/es-abstract/2015/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2015/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2015/CreateDataProperty.js b/node_modules/es-abstract/2015/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2015/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2015/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2015/CreateHTML.js b/node_modules/es-abstract/2015/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2015/CreateIterResultObject.js b/node_modules/es-abstract/2015/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2015/CreateListFromArrayLike.js b/node_modules/es-abstract/2015/CreateListFromArrayLike.js
new file mode 100644
index 0000000..d1bb8b6
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateListFromArrayLike.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = ToLength(Get(obj, 'length'));
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2015/CreateMethodProperty.js b/node_modules/es-abstract/2015/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2015/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2015/DateFromTime.js b/node_modules/es-abstract/2015/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2015/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2015/Day.js b/node_modules/es-abstract/2015/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2015/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2015/DayFromYear.js b/node_modules/es-abstract/2015/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2015/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2015/DayWithinYear.js b/node_modules/es-abstract/2015/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2015/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2015/DaysInYear.js b/node_modules/es-abstract/2015/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2015/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2015/DefinePropertyOrThrow.js b/node_modules/es-abstract/2015/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2015/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2015/DeletePropertyOrThrow.js b/node_modules/es-abstract/2015/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2015/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2015/EnumerableOwnNames.js b/node_modules/es-abstract/2015/EnumerableOwnNames.js
new file mode 100644
index 0000000..e218eda
--- /dev/null
+++ b/node_modules/es-abstract/2015/EnumerableOwnNames.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var keys = require('object-keys');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
+
+module.exports = function EnumerableOwnNames(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	return keys(O);
+};
diff --git a/node_modules/es-abstract/2015/FromPropertyDescriptor.js b/node_modules/es-abstract/2015/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2015/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2015/Get.js b/node_modules/es-abstract/2015/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2015/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2015/GetIterator.js b/node_modules/es-abstract/2015/GetIterator.js
new file mode 100644
index 0000000..a2d3b16
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetIterator.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+
+module.exports = function GetIterator(obj, method) {
+	var actualMethod = method;
+	if (arguments.length < 2) {
+		actualMethod = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray,
+				Type: Type
+			},
+			obj
+		);
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+};
diff --git a/node_modules/es-abstract/2015/GetMethod.js b/node_modules/es-abstract/2015/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2015/GetOwnPropertyKeys.js b/node_modules/es-abstract/2015/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2015/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2015/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2015/GetSubstitution.js b/node_modules/es-abstract/2015/GetSubstitution.js
new file mode 100644
index 0000000..5bdce38
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetSubstitution.js
@@ -0,0 +1,104 @@
+
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $parseInt = GetIntrinsic('%parseInt%');
+
+var inspect = require('object-inspect');
+
+var regexTester = require('../helpers/regexTester');
+var callBound = require('call-bind/callBound');
+var every = require('../helpers/every');
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2015/GetV.js b/node_modules/es-abstract/2015/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2015/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2015/HasOwnProperty.js b/node_modules/es-abstract/2015/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2015/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2015/HasProperty.js b/node_modules/es-abstract/2015/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2015/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2015/HourFromTime.js b/node_modules/es-abstract/2015/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2015/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2015/InLeapYear.js b/node_modules/es-abstract/2015/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2015/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2015/InstanceofOperator.js b/node_modules/es-abstract/2015/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2015/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2015/Invoke.js b/node_modules/es-abstract/2015/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2015/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2015/IsAccessorDescriptor.js b/node_modules/es-abstract/2015/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/IsArray.js b/node_modules/es-abstract/2015/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2015/IsCallable.js b/node_modules/es-abstract/2015/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2015/IsConcatSpreadable.js b/node_modules/es-abstract/2015/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2015/IsConstructor.js b/node_modules/es-abstract/2015/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2015/IsDataDescriptor.js b/node_modules/es-abstract/2015/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/IsExtensible.js b/node_modules/es-abstract/2015/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2015/IsGenericDescriptor.js b/node_modules/es-abstract/2015/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2015/IsInteger.js b/node_modules/es-abstract/2015/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2015/IsPromise.js b/node_modules/es-abstract/2015/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/IsPropertyDescriptor.js b/node_modules/es-abstract/2015/IsPropertyDescriptor.js
new file mode 100644
index 0000000..18fe433
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsPropertyDescriptor.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var Type = require('./Type');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+
+// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
+
+module.exports = function IsPropertyDescriptor(Desc) {
+	return isPropertyDescriptor({
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor,
+		Type: Type
+	}, Desc);
+};
diff --git a/node_modules/es-abstract/2015/IsPropertyKey.js b/node_modules/es-abstract/2015/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2015/IsRegExp.js b/node_modules/es-abstract/2015/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2015/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2015/IteratorClose.js b/node_modules/es-abstract/2015/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2015/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2015/IteratorComplete.js b/node_modules/es-abstract/2015/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2015/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2015/IteratorNext.js b/node_modules/es-abstract/2015/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2015/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2015/IteratorStep.js b/node_modules/es-abstract/2015/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2015/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2015/IteratorValue.js b/node_modules/es-abstract/2015/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2015/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2015/MakeDate.js b/node_modules/es-abstract/2015/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2015/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2015/MakeDay.js b/node_modules/es-abstract/2015/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2015/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2015/MakeTime.js b/node_modules/es-abstract/2015/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2015/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2015/MinFromTime.js b/node_modules/es-abstract/2015/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2015/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2015/MonthFromTime.js b/node_modules/es-abstract/2015/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2015/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2015/ObjectCreate.js b/node_modules/es-abstract/2015/ObjectCreate.js
new file mode 100644
index 0000000..2851a64
--- /dev/null
+++ b/node_modules/es-abstract/2015/ObjectCreate.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate
+
+module.exports = function ObjectCreate(proto, internalSlotsList) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var slots = arguments.length < 2 ? [] : internalSlotsList;
+	if (slots.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+	}
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2015/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2015/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..e2a299e
--- /dev/null
+++ b/node_modules/es-abstract/2015/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var ObjectCreate = require('./ObjectCreate');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return ObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2015/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2015/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2015/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2015/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2015/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2015/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2015/OrdinaryHasInstance.js b/node_modules/es-abstract/2015/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2015/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2015/OrdinaryHasProperty.js b/node_modules/es-abstract/2015/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2015/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2015/QuoteJSONString.js b/node_modules/es-abstract/2015/QuoteJSONString.js
new file mode 100644
index 0000000..884afef
--- /dev/null
+++ b/node_modules/es-abstract/2015/QuoteJSONString.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+var $strSlice = callBound('String.prototype.slice');
+var $strSplit = callBound('String.prototype.split');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': 'b',
+	'\u000C': 'f',
+	'\u000A': 'n',
+	'\u000D': 'r',
+	'\u0009': 't'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach($strSplit(value), function (C) {
+			if (C === '"' || C === '\\') {
+				product += '\u005C' + C;
+			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
+				var abbrev = escapes[C];
+				product += '\u005C' + abbrev;
+			} else {
+				var cCharCode = $charCodeAt(C, 0);
+				if (cCharCode < 0x20) {
+					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
+				} else {
+					product += C;
+				}
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2015/RegExpCreate.js b/node_modules/es-abstract/2015/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2015/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2015/RegExpExec.js b/node_modules/es-abstract/2015/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2015/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2015/RequireObjectCoercible.js b/node_modules/es-abstract/2015/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2015/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2015/SameValue.js b/node_modules/es-abstract/2015/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2015/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2015/SameValueZero.js b/node_modules/es-abstract/2015/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2015/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2015/SecFromTime.js b/node_modules/es-abstract/2015/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2015/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2015/Set.js b/node_modules/es-abstract/2015/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2015/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2015/SetFunctionName.js b/node_modules/es-abstract/2015/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2015/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2015/SetIntegrityLevel.js b/node_modules/es-abstract/2015/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2015/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/SpeciesConstructor.js b/node_modules/es-abstract/2015/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2015/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2015/SplitMatch.js b/node_modules/es-abstract/2015/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2015/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2015/StrictEqualityComparison.js b/node_modules/es-abstract/2015/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2015/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2015/StringCreate.js b/node_modules/es-abstract/2015/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2015/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2015/StringGetIndexProperty.js b/node_modules/es-abstract/2015/StringGetIndexProperty.js
new file mode 100644
index 0000000..73043dd
--- /dev/null
+++ b/node_modules/es-abstract/2015/StringGetIndexProperty.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charAt = callBound('String.prototype.charAt');
+
+var isString = require('is-string');
+var isNegativeZero = require('is-negative-zero');
+var unbox = require('unbox-primitive');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/6.0/#sec-stringgetindexproperty
+
+module.exports = function StringGetIndexProperty(S, P) {
+	if (typeof S === 'string' || !isString(S)) {
+		throw new $TypeError('Assertion failed: `S` must be a boxed String Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+
+	var index = CanonicalNumericIndexString(P);
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index)) {
+		return void undefined;
+	}
+
+	var str = unbox(S);
+	var len = str.length;
+	if (index < 0 || len <= index) {
+		return void undefined;
+	}
+
+	var resultStr = $charAt(str, index);
+
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2015/SymbolDescriptiveString.js b/node_modules/es-abstract/2015/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2015/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2015/TestIntegrityLevel.js b/node_modules/es-abstract/2015/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2015/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2015/TimeClip.js b/node_modules/es-abstract/2015/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2015/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2015/TimeFromYear.js b/node_modules/es-abstract/2015/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2015/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2015/TimeWithinDay.js b/node_modules/es-abstract/2015/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2015/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2015/ToBoolean.js b/node_modules/es-abstract/2015/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2015/ToDateString.js b/node_modules/es-abstract/2015/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2015/ToInt16.js b/node_modules/es-abstract/2015/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2015/ToInt32.js b/node_modules/es-abstract/2015/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2015/ToInt8.js b/node_modules/es-abstract/2015/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2015/ToInteger.js b/node_modules/es-abstract/2015/ToInteger.js
new file mode 100644
index 0000000..2975818
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToInteger.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	return ES5ToInteger(number);
+};
diff --git a/node_modules/es-abstract/2015/ToLength.js b/node_modules/es-abstract/2015/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2015/ToNumber.js b/node_modules/es-abstract/2015/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2015/ToObject.js b/node_modules/es-abstract/2015/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2015/ToPrimitive.js b/node_modules/es-abstract/2015/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2015/ToPropertyDescriptor.js b/node_modules/es-abstract/2015/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2015/ToPropertyKey.js b/node_modules/es-abstract/2015/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2015/ToString.js b/node_modules/es-abstract/2015/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2015/ToUint16.js b/node_modules/es-abstract/2015/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2015/ToUint32.js b/node_modules/es-abstract/2015/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2015/ToUint8.js b/node_modules/es-abstract/2015/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2015/ToUint8Clamp.js b/node_modules/es-abstract/2015/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2015/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2015/Type.js b/node_modules/es-abstract/2015/Type.js
new file mode 100644
index 0000000..0bd1165
--- /dev/null
+++ b/node_modules/es-abstract/2015/Type.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2015/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2015/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2015/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2015/WeekDay.js b/node_modules/es-abstract/2015/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2015/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2015/YearFromTime.js b/node_modules/es-abstract/2015/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2015/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2015/abs.js b/node_modules/es-abstract/2015/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2015/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2015/floor.js b/node_modules/es-abstract/2015/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2015/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2015/modulo.js b/node_modules/es-abstract/2015/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2015/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2015/msFromTime.js b/node_modules/es-abstract/2015/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2015/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2015/thisBooleanValue.js b/node_modules/es-abstract/2015/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2015/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2015/thisNumberValue.js b/node_modules/es-abstract/2015/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2015/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2015/thisStringValue.js b/node_modules/es-abstract/2015/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2015/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2015/thisTimeValue.js b/node_modules/es-abstract/2015/thisTimeValue.js
new file mode 100644
index 0000000..12548fa
--- /dev/null
+++ b/node_modules/es-abstract/2015/thisTimeValue.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $DateValueOf = require('call-bind/callBound')('Date.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
+
+module.exports = function thisTimeValue(value) {
+	return $DateValueOf(value);
+};
diff --git a/node_modules/es-abstract/2016/AbstractEqualityComparison.js b/node_modules/es-abstract/2016/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2016/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2016/AbstractRelationalComparison.js b/node_modules/es-abstract/2016/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2016/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2016/AdvanceStringIndex.js b/node_modules/es-abstract/2016/AdvanceStringIndex.js
new file mode 100644
index 0000000..279602b
--- /dev/null
+++ b/node_modules/es-abstract/2016/AdvanceStringIndex.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+
+	var first = $charCodeAt(S, index);
+	if (!isLeadingSurrogate(first)) {
+		return index + 1;
+	}
+
+	var second = $charCodeAt(S, index + 1);
+	if (!isTrailingSurrogate(second)) {
+		return index + 1;
+	}
+
+	return index + 2;
+};
diff --git a/node_modules/es-abstract/2016/ArrayCreate.js b/node_modules/es-abstract/2016/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2016/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2016/ArraySetLength.js b/node_modules/es-abstract/2016/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2016/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/ArraySpeciesCreate.js b/node_modules/es-abstract/2016/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2016/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2016/Call.js b/node_modules/es-abstract/2016/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2016/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2016/CanonicalNumericIndexString.js b/node_modules/es-abstract/2016/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2016/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2016/CompletePropertyDescriptor.js b/node_modules/es-abstract/2016/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2016/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2016/CreateDataProperty.js b/node_modules/es-abstract/2016/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2016/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2016/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2016/CreateHTML.js b/node_modules/es-abstract/2016/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2016/CreateIterResultObject.js b/node_modules/es-abstract/2016/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2016/CreateListFromArrayLike.js b/node_modules/es-abstract/2016/CreateListFromArrayLike.js
new file mode 100644
index 0000000..d1bb8b6
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateListFromArrayLike.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = ToLength(Get(obj, 'length'));
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2016/CreateMethodProperty.js b/node_modules/es-abstract/2016/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2016/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2016/DateFromTime.js b/node_modules/es-abstract/2016/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2016/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2016/Day.js b/node_modules/es-abstract/2016/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2016/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2016/DayFromYear.js b/node_modules/es-abstract/2016/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2016/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2016/DayWithinYear.js b/node_modules/es-abstract/2016/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2016/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2016/DaysInYear.js b/node_modules/es-abstract/2016/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2016/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2016/DefinePropertyOrThrow.js b/node_modules/es-abstract/2016/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2016/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2016/DeletePropertyOrThrow.js b/node_modules/es-abstract/2016/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2016/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2016/EnumerableOwnNames.js b/node_modules/es-abstract/2016/EnumerableOwnNames.js
new file mode 100644
index 0000000..e218eda
--- /dev/null
+++ b/node_modules/es-abstract/2016/EnumerableOwnNames.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var keys = require('object-keys');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
+
+module.exports = function EnumerableOwnNames(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	return keys(O);
+};
diff --git a/node_modules/es-abstract/2016/FromPropertyDescriptor.js b/node_modules/es-abstract/2016/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2016/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2016/Get.js b/node_modules/es-abstract/2016/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2016/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2016/GetIterator.js b/node_modules/es-abstract/2016/GetIterator.js
new file mode 100644
index 0000000..a2d3b16
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetIterator.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+
+module.exports = function GetIterator(obj, method) {
+	var actualMethod = method;
+	if (arguments.length < 2) {
+		actualMethod = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray,
+				Type: Type
+			},
+			obj
+		);
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+};
diff --git a/node_modules/es-abstract/2016/GetMethod.js b/node_modules/es-abstract/2016/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2016/GetOwnPropertyKeys.js b/node_modules/es-abstract/2016/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2016/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2016/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2016/GetSubstitution.js b/node_modules/es-abstract/2016/GetSubstitution.js
new file mode 100644
index 0000000..5bdce38
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetSubstitution.js
@@ -0,0 +1,104 @@
+
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $parseInt = GetIntrinsic('%parseInt%');
+
+var inspect = require('object-inspect');
+
+var regexTester = require('../helpers/regexTester');
+var callBound = require('call-bind/callBound');
+var every = require('../helpers/every');
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2016/GetV.js b/node_modules/es-abstract/2016/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2016/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2016/HasOwnProperty.js b/node_modules/es-abstract/2016/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2016/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2016/HasProperty.js b/node_modules/es-abstract/2016/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2016/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2016/HourFromTime.js b/node_modules/es-abstract/2016/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2016/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2016/InLeapYear.js b/node_modules/es-abstract/2016/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2016/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2016/InstanceofOperator.js b/node_modules/es-abstract/2016/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2016/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2016/Invoke.js b/node_modules/es-abstract/2016/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2016/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2016/IsAccessorDescriptor.js b/node_modules/es-abstract/2016/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/IsArray.js b/node_modules/es-abstract/2016/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2016/IsCallable.js b/node_modules/es-abstract/2016/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2016/IsConcatSpreadable.js b/node_modules/es-abstract/2016/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2016/IsConstructor.js b/node_modules/es-abstract/2016/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2016/IsDataDescriptor.js b/node_modules/es-abstract/2016/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/IsExtensible.js b/node_modules/es-abstract/2016/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2016/IsGenericDescriptor.js b/node_modules/es-abstract/2016/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2016/IsInteger.js b/node_modules/es-abstract/2016/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2016/IsPromise.js b/node_modules/es-abstract/2016/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/IsPropertyDescriptor.js b/node_modules/es-abstract/2016/IsPropertyDescriptor.js
new file mode 100644
index 0000000..18fe433
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsPropertyDescriptor.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var Type = require('./Type');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+
+// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
+
+module.exports = function IsPropertyDescriptor(Desc) {
+	return isPropertyDescriptor({
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor,
+		Type: Type
+	}, Desc);
+};
diff --git a/node_modules/es-abstract/2016/IsPropertyKey.js b/node_modules/es-abstract/2016/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2016/IsRegExp.js b/node_modules/es-abstract/2016/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2016/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2016/IterableToArrayLike.js b/node_modules/es-abstract/2016/IterableToArrayLike.js
new file mode 100644
index 0000000..a16bbba
--- /dev/null
+++ b/node_modules/es-abstract/2016/IterableToArrayLike.js
@@ -0,0 +1,56 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+var $arrayPush = callBound('Array.prototype.push');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var GetIterator = require('./GetIterator');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+var ToObject = require('./ToObject');
+var Type = require('./Type');
+var ES = {
+	AdvanceStringIndex: AdvanceStringIndex,
+	GetMethod: GetMethod,
+	IsArray: IsArray,
+	Type: Type
+};
+
+// https://262.ecma-international.org/7.0/#sec-iterabletoarraylike
+/**
+ * 1. Let usingIterator be ? GetMethod(items, @@iterator).
+ * 2. If usingIterator is not undefined, then
+ *    1. Let iterator be ? GetIterator(items, usingIterator).
+ *    2. Let values be a new empty List.
+ *    3. Let next be true.
+ *    4. Repeat, while next is not false
+ *       1. Let next be ? IteratorStep(iterator).
+ *       2. If next is not false, then
+ *          1. Let nextValue be ? IteratorValue(next).
+ *          2. Append nextValue to the end of the List values.
+ *    5. Return CreateArrayFromList(values).
+ * 3. NOTE: items is not an Iterable so assume it is already an array-like object.
+ * 4. Return ! ToObject(items).
+ */
+
+module.exports = function IterableToArrayLike(items) {
+	var usingIterator = getIteratorMethod(ES, items);
+	if (typeof usingIterator !== 'undefined') {
+		var iterator = GetIterator(items, usingIterator);
+		var values = [];
+		var next = true;
+		while (next) {
+			next = IteratorStep(iterator);
+			if (next) {
+				var nextValue = IteratorValue(next);
+				$arrayPush(values, nextValue);
+			}
+		}
+		return values;
+	}
+
+	return ToObject(items);
+};
diff --git a/node_modules/es-abstract/2016/IteratorClose.js b/node_modules/es-abstract/2016/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2016/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2016/IteratorComplete.js b/node_modules/es-abstract/2016/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2016/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2016/IteratorNext.js b/node_modules/es-abstract/2016/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2016/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2016/IteratorStep.js b/node_modules/es-abstract/2016/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2016/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2016/IteratorValue.js b/node_modules/es-abstract/2016/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2016/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2016/MakeDate.js b/node_modules/es-abstract/2016/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2016/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2016/MakeDay.js b/node_modules/es-abstract/2016/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2016/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2016/MakeTime.js b/node_modules/es-abstract/2016/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2016/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2016/MinFromTime.js b/node_modules/es-abstract/2016/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2016/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2016/MonthFromTime.js b/node_modules/es-abstract/2016/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2016/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2016/ObjectCreate.js b/node_modules/es-abstract/2016/ObjectCreate.js
new file mode 100644
index 0000000..2851a64
--- /dev/null
+++ b/node_modules/es-abstract/2016/ObjectCreate.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate
+
+module.exports = function ObjectCreate(proto, internalSlotsList) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var slots = arguments.length < 2 ? [] : internalSlotsList;
+	if (slots.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+	}
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2016/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..e2a299e
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var ObjectCreate = require('./ObjectCreate');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return ObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2016/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2016/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryGetPrototypeOf.js b/node_modules/es-abstract/2016/OrdinaryGetPrototypeOf.js
new file mode 100644
index 0000000..ba17b98
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryGetPrototypeOf.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $getProto = require('../helpers/getProto');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof
+
+module.exports = function OrdinaryGetPrototypeOf(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!$getProto) {
+		throw new $TypeError('This environment does not support fetching prototypes.');
+	}
+	return $getProto(O);
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryHasInstance.js b/node_modules/es-abstract/2016/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2016/OrdinaryHasProperty.js b/node_modules/es-abstract/2016/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2016/OrdinarySetPrototypeOf.js b/node_modules/es-abstract/2016/OrdinarySetPrototypeOf.js
new file mode 100644
index 0000000..d0ff7a7
--- /dev/null
+++ b/node_modules/es-abstract/2016/OrdinarySetPrototypeOf.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $setProto = require('../helpers/setProto');
+
+var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof
+
+module.exports = function OrdinarySetPrototypeOf(O, V) {
+	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
+		throw new $TypeError('Assertion failed: V must be Object or Null');
+	}
+	/*
+    var extensible = IsExtensible(O);
+    var current = OrdinaryGetPrototypeOf(O);
+    if (SameValue(V, current)) {
+        return true;
+    }
+    if (!extensible) {
+        return false;
+    }
+    */
+	try {
+		$setProto(O, V);
+	} catch (e) {
+		return false;
+	}
+	return OrdinaryGetPrototypeOf(O) === V;
+	/*
+    var p = V;
+    var done = false;
+    while (!done) {
+        if (p === null) {
+            done = true;
+        } else if (SameValue(p, O)) {
+            return false;
+        } else {
+            if (wat) {
+                done = true;
+            } else {
+                p = p.[[Prototype]];
+            }
+        }
+     }
+     O.[[Prototype]] = V;
+     return true;
+     */
+};
diff --git a/node_modules/es-abstract/2016/QuoteJSONString.js b/node_modules/es-abstract/2016/QuoteJSONString.js
new file mode 100644
index 0000000..884afef
--- /dev/null
+++ b/node_modules/es-abstract/2016/QuoteJSONString.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+var $strSlice = callBound('String.prototype.slice');
+var $strSplit = callBound('String.prototype.split');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': 'b',
+	'\u000C': 'f',
+	'\u000A': 'n',
+	'\u000D': 'r',
+	'\u0009': 't'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach($strSplit(value), function (C) {
+			if (C === '"' || C === '\\') {
+				product += '\u005C' + C;
+			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
+				var abbrev = escapes[C];
+				product += '\u005C' + abbrev;
+			} else {
+				var cCharCode = $charCodeAt(C, 0);
+				if (cCharCode < 0x20) {
+					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
+				} else {
+					product += C;
+				}
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2016/RegExpCreate.js b/node_modules/es-abstract/2016/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2016/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2016/RegExpExec.js b/node_modules/es-abstract/2016/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2016/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2016/RequireObjectCoercible.js b/node_modules/es-abstract/2016/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2016/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2016/SameValue.js b/node_modules/es-abstract/2016/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2016/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2016/SameValueNonNumber.js b/node_modules/es-abstract/2016/SameValueNonNumber.js
new file mode 100644
index 0000000..b6d2c4e
--- /dev/null
+++ b/node_modules/es-abstract/2016/SameValueNonNumber.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+
+// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber
+
+module.exports = function SameValueNonNumber(x, y) {
+	if (typeof x === 'number' || typeof x !== typeof y) {
+		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
+	}
+	return SameValue(x, y);
+};
diff --git a/node_modules/es-abstract/2016/SameValueZero.js b/node_modules/es-abstract/2016/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2016/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2016/SecFromTime.js b/node_modules/es-abstract/2016/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2016/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2016/Set.js b/node_modules/es-abstract/2016/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2016/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2016/SetFunctionName.js b/node_modules/es-abstract/2016/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2016/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2016/SetIntegrityLevel.js b/node_modules/es-abstract/2016/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2016/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/SpeciesConstructor.js b/node_modules/es-abstract/2016/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2016/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2016/SplitMatch.js b/node_modules/es-abstract/2016/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2016/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2016/StrictEqualityComparison.js b/node_modules/es-abstract/2016/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2016/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2016/StringCreate.js b/node_modules/es-abstract/2016/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2016/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2016/SymbolDescriptiveString.js b/node_modules/es-abstract/2016/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2016/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2016/TestIntegrityLevel.js b/node_modules/es-abstract/2016/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2016/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2016/TimeClip.js b/node_modules/es-abstract/2016/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2016/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2016/TimeFromYear.js b/node_modules/es-abstract/2016/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2016/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2016/TimeWithinDay.js b/node_modules/es-abstract/2016/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2016/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2016/ToBoolean.js b/node_modules/es-abstract/2016/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2016/ToDateString.js b/node_modules/es-abstract/2016/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2016/ToInt16.js b/node_modules/es-abstract/2016/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2016/ToInt32.js b/node_modules/es-abstract/2016/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2016/ToInt8.js b/node_modules/es-abstract/2016/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2016/ToInteger.js b/node_modules/es-abstract/2016/ToInteger.js
new file mode 100644
index 0000000..2975818
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToInteger.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	return ES5ToInteger(number);
+};
diff --git a/node_modules/es-abstract/2016/ToLength.js b/node_modules/es-abstract/2016/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2016/ToNumber.js b/node_modules/es-abstract/2016/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2016/ToObject.js b/node_modules/es-abstract/2016/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2016/ToPrimitive.js b/node_modules/es-abstract/2016/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2016/ToPropertyDescriptor.js b/node_modules/es-abstract/2016/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2016/ToPropertyKey.js b/node_modules/es-abstract/2016/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2016/ToString.js b/node_modules/es-abstract/2016/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2016/ToUint16.js b/node_modules/es-abstract/2016/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2016/ToUint32.js b/node_modules/es-abstract/2016/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2016/ToUint8.js b/node_modules/es-abstract/2016/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2016/ToUint8Clamp.js b/node_modules/es-abstract/2016/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2016/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2016/Type.js b/node_modules/es-abstract/2016/Type.js
new file mode 100644
index 0000000..0bd1165
--- /dev/null
+++ b/node_modules/es-abstract/2016/Type.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2016/UTF16Decode.js b/node_modules/es-abstract/2016/UTF16Decode.js
new file mode 100644
index 0000000..86927b4
--- /dev/null
+++ b/node_modules/es-abstract/2016/UTF16Decode.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+// https://262.ecma-international.org/7.0/#sec-utf16decode
+
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair
+
+module.exports = function UTF16Decode(lead, trail) {
+	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
+		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
+	}
+	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+	return $fromCharCode(lead) + $fromCharCode(trail);
+};
diff --git a/node_modules/es-abstract/2016/UTF16Encoding.js b/node_modules/es-abstract/2016/UTF16Encoding.js
new file mode 100644
index 0000000..f381595
--- /dev/null
+++ b/node_modules/es-abstract/2016/UTF16Encoding.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var isCodePoint = require('../helpers/isCodePoint');
+
+// https://262.ecma-international.org/7.0/#sec-utf16encoding
+
+module.exports = function UTF16Encoding(cp) {
+	if (!isCodePoint(cp)) {
+		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
+	}
+	if (cp <= 65535) {
+		return $fromCharCode(cp);
+	}
+	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
+	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
+	return $fromCharCode(cu1) + $fromCharCode(cu2);
+};
diff --git a/node_modules/es-abstract/2016/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2016/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2016/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2016/WeekDay.js b/node_modules/es-abstract/2016/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2016/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2016/YearFromTime.js b/node_modules/es-abstract/2016/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2016/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2016/abs.js b/node_modules/es-abstract/2016/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2016/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2016/floor.js b/node_modules/es-abstract/2016/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2016/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2016/modulo.js b/node_modules/es-abstract/2016/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2016/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2016/msFromTime.js b/node_modules/es-abstract/2016/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2016/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2016/thisBooleanValue.js b/node_modules/es-abstract/2016/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2016/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2016/thisNumberValue.js b/node_modules/es-abstract/2016/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2016/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2016/thisStringValue.js b/node_modules/es-abstract/2016/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2016/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2016/thisTimeValue.js b/node_modules/es-abstract/2016/thisTimeValue.js
new file mode 100644
index 0000000..12548fa
--- /dev/null
+++ b/node_modules/es-abstract/2016/thisTimeValue.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $DateValueOf = require('call-bind/callBound')('Date.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
+
+module.exports = function thisTimeValue(value) {
+	return $DateValueOf(value);
+};
diff --git a/node_modules/es-abstract/2017/AbstractEqualityComparison.js b/node_modules/es-abstract/2017/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2017/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2017/AbstractRelationalComparison.js b/node_modules/es-abstract/2017/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2017/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2017/AdvanceStringIndex.js b/node_modules/es-abstract/2017/AdvanceStringIndex.js
new file mode 100644
index 0000000..279602b
--- /dev/null
+++ b/node_modules/es-abstract/2017/AdvanceStringIndex.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+
+	var first = $charCodeAt(S, index);
+	if (!isLeadingSurrogate(first)) {
+		return index + 1;
+	}
+
+	var second = $charCodeAt(S, index + 1);
+	if (!isTrailingSurrogate(second)) {
+		return index + 1;
+	}
+
+	return index + 2;
+};
diff --git a/node_modules/es-abstract/2017/ArrayCreate.js b/node_modules/es-abstract/2017/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2017/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2017/ArraySetLength.js b/node_modules/es-abstract/2017/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2017/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/ArraySpeciesCreate.js b/node_modules/es-abstract/2017/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2017/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2017/Call.js b/node_modules/es-abstract/2017/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2017/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2017/CanonicalNumericIndexString.js b/node_modules/es-abstract/2017/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2017/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2017/CompletePropertyDescriptor.js b/node_modules/es-abstract/2017/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2017/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2017/CreateDataProperty.js b/node_modules/es-abstract/2017/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2017/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2017/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2017/CreateHTML.js b/node_modules/es-abstract/2017/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2017/CreateIterResultObject.js b/node_modules/es-abstract/2017/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2017/CreateListFromArrayLike.js b/node_modules/es-abstract/2017/CreateListFromArrayLike.js
new file mode 100644
index 0000000..d1bb8b6
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateListFromArrayLike.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = ToLength(Get(obj, 'length'));
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2017/CreateMethodProperty.js b/node_modules/es-abstract/2017/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2017/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2017/DateFromTime.js b/node_modules/es-abstract/2017/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2017/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2017/Day.js b/node_modules/es-abstract/2017/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2017/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2017/DayFromYear.js b/node_modules/es-abstract/2017/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2017/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2017/DayWithinYear.js b/node_modules/es-abstract/2017/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2017/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2017/DaysInYear.js b/node_modules/es-abstract/2017/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2017/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2017/DefinePropertyOrThrow.js b/node_modules/es-abstract/2017/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2017/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2017/DeletePropertyOrThrow.js b/node_modules/es-abstract/2017/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2017/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2017/EnumerableOwnProperties.js b/node_modules/es-abstract/2017/EnumerableOwnProperties.js
new file mode 100644
index 0000000..44171b9
--- /dev/null
+++ b/node_modules/es-abstract/2017/EnumerableOwnProperties.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var objectKeys = require('object-keys');
+
+var callBound = require('call-bind/callBound');
+
+var callBind = require('call-bind');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
+
+var forEach = require('../helpers/forEach');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/8.0/#sec-enumerableownproperties
+
+module.exports = function EnumerableOwnProperties(O, kind) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	var keys = objectKeys(O);
+	if (kind === 'key') {
+		return keys;
+	}
+	if (kind === 'value' || kind === 'key+value') {
+		var results = [];
+		forEach(keys, function (key) {
+			if ($isEnumerable(O, key)) {
+				$pushApply(results, [
+					kind === 'value' ? O[key] : [key, O[key]]
+				]);
+			}
+		});
+		return results;
+	}
+	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
+};
diff --git a/node_modules/es-abstract/2017/FromPropertyDescriptor.js b/node_modules/es-abstract/2017/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2017/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2017/Get.js b/node_modules/es-abstract/2017/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2017/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2017/GetIterator.js b/node_modules/es-abstract/2017/GetIterator.js
new file mode 100644
index 0000000..a2d3b16
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetIterator.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+
+module.exports = function GetIterator(obj, method) {
+	var actualMethod = method;
+	if (arguments.length < 2) {
+		actualMethod = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray,
+				Type: Type
+			},
+			obj
+		);
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+};
diff --git a/node_modules/es-abstract/2017/GetMethod.js b/node_modules/es-abstract/2017/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2017/GetOwnPropertyKeys.js b/node_modules/es-abstract/2017/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2017/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2017/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2017/GetSubstitution.js b/node_modules/es-abstract/2017/GetSubstitution.js
new file mode 100644
index 0000000..5bdce38
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetSubstitution.js
@@ -0,0 +1,104 @@
+
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $parseInt = GetIntrinsic('%parseInt%');
+
+var inspect = require('object-inspect');
+
+var regexTester = require('../helpers/regexTester');
+var callBound = require('call-bind/callBound');
+var every = require('../helpers/every');
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2017/GetV.js b/node_modules/es-abstract/2017/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2017/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2017/HasOwnProperty.js b/node_modules/es-abstract/2017/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2017/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2017/HasProperty.js b/node_modules/es-abstract/2017/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2017/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2017/HourFromTime.js b/node_modules/es-abstract/2017/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2017/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2017/InLeapYear.js b/node_modules/es-abstract/2017/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2017/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2017/InstanceofOperator.js b/node_modules/es-abstract/2017/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2017/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2017/Invoke.js b/node_modules/es-abstract/2017/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2017/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2017/IsAccessorDescriptor.js b/node_modules/es-abstract/2017/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/IsArray.js b/node_modules/es-abstract/2017/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2017/IsCallable.js b/node_modules/es-abstract/2017/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2017/IsConcatSpreadable.js b/node_modules/es-abstract/2017/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2017/IsConstructor.js b/node_modules/es-abstract/2017/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2017/IsDataDescriptor.js b/node_modules/es-abstract/2017/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/IsExtensible.js b/node_modules/es-abstract/2017/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2017/IsGenericDescriptor.js b/node_modules/es-abstract/2017/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2017/IsInteger.js b/node_modules/es-abstract/2017/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2017/IsPromise.js b/node_modules/es-abstract/2017/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/IsPropertyDescriptor.js b/node_modules/es-abstract/2017/IsPropertyDescriptor.js
new file mode 100644
index 0000000..18fe433
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsPropertyDescriptor.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var Type = require('./Type');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+
+// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
+
+module.exports = function IsPropertyDescriptor(Desc) {
+	return isPropertyDescriptor({
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor,
+		Type: Type
+	}, Desc);
+};
diff --git a/node_modules/es-abstract/2017/IsPropertyKey.js b/node_modules/es-abstract/2017/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2017/IsRegExp.js b/node_modules/es-abstract/2017/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2017/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2017/IterableToList.js b/node_modules/es-abstract/2017/IterableToList.js
new file mode 100644
index 0000000..6a1a6be
--- /dev/null
+++ b/node_modules/es-abstract/2017/IterableToList.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+var $arrayPush = callBound('Array.prototype.push');
+
+var GetIterator = require('./GetIterator');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+
+// https://262.ecma-international.org/8.0/#sec-iterabletolist
+
+module.exports = function IterableToList(items, method) {
+	var iterator = GetIterator(items, method);
+	var values = [];
+	var next = true;
+	while (next) {
+		next = IteratorStep(iterator);
+		if (next) {
+			var nextValue = IteratorValue(next);
+			$arrayPush(values, nextValue);
+		}
+	}
+	return values;
+};
diff --git a/node_modules/es-abstract/2017/IteratorClose.js b/node_modules/es-abstract/2017/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2017/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2017/IteratorComplete.js b/node_modules/es-abstract/2017/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2017/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2017/IteratorNext.js b/node_modules/es-abstract/2017/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2017/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2017/IteratorStep.js b/node_modules/es-abstract/2017/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2017/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2017/IteratorValue.js b/node_modules/es-abstract/2017/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2017/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2017/MakeDate.js b/node_modules/es-abstract/2017/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2017/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2017/MakeDay.js b/node_modules/es-abstract/2017/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2017/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2017/MakeTime.js b/node_modules/es-abstract/2017/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2017/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2017/MinFromTime.js b/node_modules/es-abstract/2017/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2017/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2017/MonthFromTime.js b/node_modules/es-abstract/2017/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2017/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2017/ObjectCreate.js b/node_modules/es-abstract/2017/ObjectCreate.js
new file mode 100644
index 0000000..2851a64
--- /dev/null
+++ b/node_modules/es-abstract/2017/ObjectCreate.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate
+
+module.exports = function ObjectCreate(proto, internalSlotsList) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var slots = arguments.length < 2 ? [] : internalSlotsList;
+	if (slots.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+	}
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2017/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..e2a299e
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var ObjectCreate = require('./ObjectCreate');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return ObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2017/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2017/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryGetPrototypeOf.js b/node_modules/es-abstract/2017/OrdinaryGetPrototypeOf.js
new file mode 100644
index 0000000..ba17b98
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryGetPrototypeOf.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $getProto = require('../helpers/getProto');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof
+
+module.exports = function OrdinaryGetPrototypeOf(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!$getProto) {
+		throw new $TypeError('This environment does not support fetching prototypes.');
+	}
+	return $getProto(O);
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryHasInstance.js b/node_modules/es-abstract/2017/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2017/OrdinaryHasProperty.js b/node_modules/es-abstract/2017/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2017/OrdinarySetPrototypeOf.js b/node_modules/es-abstract/2017/OrdinarySetPrototypeOf.js
new file mode 100644
index 0000000..d0ff7a7
--- /dev/null
+++ b/node_modules/es-abstract/2017/OrdinarySetPrototypeOf.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $setProto = require('../helpers/setProto');
+
+var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof
+
+module.exports = function OrdinarySetPrototypeOf(O, V) {
+	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
+		throw new $TypeError('Assertion failed: V must be Object or Null');
+	}
+	/*
+    var extensible = IsExtensible(O);
+    var current = OrdinaryGetPrototypeOf(O);
+    if (SameValue(V, current)) {
+        return true;
+    }
+    if (!extensible) {
+        return false;
+    }
+    */
+	try {
+		$setProto(O, V);
+	} catch (e) {
+		return false;
+	}
+	return OrdinaryGetPrototypeOf(O) === V;
+	/*
+    var p = V;
+    var done = false;
+    while (!done) {
+        if (p === null) {
+            done = true;
+        } else if (SameValue(p, O)) {
+            return false;
+        } else {
+            if (wat) {
+                done = true;
+            } else {
+                p = p.[[Prototype]];
+            }
+        }
+     }
+     O.[[Prototype]] = V;
+     return true;
+     */
+};
diff --git a/node_modules/es-abstract/2017/QuoteJSONString.js b/node_modules/es-abstract/2017/QuoteJSONString.js
new file mode 100644
index 0000000..884afef
--- /dev/null
+++ b/node_modules/es-abstract/2017/QuoteJSONString.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+var $strSlice = callBound('String.prototype.slice');
+var $strSplit = callBound('String.prototype.split');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': 'b',
+	'\u000C': 'f',
+	'\u000A': 'n',
+	'\u000D': 'r',
+	'\u0009': 't'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach($strSplit(value), function (C) {
+			if (C === '"' || C === '\\') {
+				product += '\u005C' + C;
+			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
+				var abbrev = escapes[C];
+				product += '\u005C' + abbrev;
+			} else {
+				var cCharCode = $charCodeAt(C, 0);
+				if (cCharCode < 0x20) {
+					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
+				} else {
+					product += C;
+				}
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2017/RegExpCreate.js b/node_modules/es-abstract/2017/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2017/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2017/RegExpExec.js b/node_modules/es-abstract/2017/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2017/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2017/RequireObjectCoercible.js b/node_modules/es-abstract/2017/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2017/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2017/SameValue.js b/node_modules/es-abstract/2017/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2017/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2017/SameValueNonNumber.js b/node_modules/es-abstract/2017/SameValueNonNumber.js
new file mode 100644
index 0000000..b6d2c4e
--- /dev/null
+++ b/node_modules/es-abstract/2017/SameValueNonNumber.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+
+// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber
+
+module.exports = function SameValueNonNumber(x, y) {
+	if (typeof x === 'number' || typeof x !== typeof y) {
+		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
+	}
+	return SameValue(x, y);
+};
diff --git a/node_modules/es-abstract/2017/SameValueZero.js b/node_modules/es-abstract/2017/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2017/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2017/SecFromTime.js b/node_modules/es-abstract/2017/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2017/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2017/Set.js b/node_modules/es-abstract/2017/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2017/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2017/SetFunctionName.js b/node_modules/es-abstract/2017/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2017/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2017/SetIntegrityLevel.js b/node_modules/es-abstract/2017/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2017/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/SpeciesConstructor.js b/node_modules/es-abstract/2017/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2017/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2017/SplitMatch.js b/node_modules/es-abstract/2017/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2017/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2017/StrictEqualityComparison.js b/node_modules/es-abstract/2017/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2017/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2017/StringCreate.js b/node_modules/es-abstract/2017/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2017/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2017/StringGetOwnProperty.js b/node_modules/es-abstract/2017/StringGetOwnProperty.js
new file mode 100644
index 0000000..b6f904e
--- /dev/null
+++ b/node_modules/es-abstract/2017/StringGetOwnProperty.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var $charAt = callBound('String.prototype.charAt');
+var $stringToString = callBound('String.prototype.toString');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+var isNegativeZero = require('is-negative-zero');
+
+// https://262.ecma-international.org/8.0/#sec-stringgetownproperty
+
+module.exports = function StringGetOwnProperty(S, P) {
+	var str;
+	if (Type(S) === 'Object') {
+		try {
+			str = $stringToString(S);
+		} catch (e) { /**/ }
+	}
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+	var index = CanonicalNumericIndexString(P);
+	var len = str.length;
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
+		return void undefined;
+	}
+	var resultStr = $charAt(S, index);
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2017/SymbolDescriptiveString.js b/node_modules/es-abstract/2017/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2017/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2017/TestIntegrityLevel.js b/node_modules/es-abstract/2017/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2017/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2017/TimeClip.js b/node_modules/es-abstract/2017/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2017/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2017/TimeFromYear.js b/node_modules/es-abstract/2017/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2017/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2017/TimeWithinDay.js b/node_modules/es-abstract/2017/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2017/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2017/ToBoolean.js b/node_modules/es-abstract/2017/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2017/ToDateString.js b/node_modules/es-abstract/2017/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2017/ToIndex.js b/node_modules/es-abstract/2017/ToIndex.js
new file mode 100644
index 0000000..7c9d746
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToIndex.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+
+var ToInteger = require('./ToInteger');
+var ToLength = require('./ToLength');
+var SameValueZero = require('./SameValueZero');
+
+// https://262.ecma-international.org/8.0/#sec-toindex
+
+module.exports = function ToIndex(value) {
+	if (typeof value === 'undefined') {
+		return 0;
+	}
+	var integerIndex = ToInteger(value);
+	if (integerIndex < 0) {
+		throw new $RangeError('index must be >= 0');
+	}
+	var index = ToLength(integerIndex);
+	if (!SameValueZero(integerIndex, index)) {
+		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
+	}
+	return index;
+};
diff --git a/node_modules/es-abstract/2017/ToInt16.js b/node_modules/es-abstract/2017/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2017/ToInt32.js b/node_modules/es-abstract/2017/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2017/ToInt8.js b/node_modules/es-abstract/2017/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2017/ToInteger.js b/node_modules/es-abstract/2017/ToInteger.js
new file mode 100644
index 0000000..2975818
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToInteger.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	return ES5ToInteger(number);
+};
diff --git a/node_modules/es-abstract/2017/ToLength.js b/node_modules/es-abstract/2017/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2017/ToNumber.js b/node_modules/es-abstract/2017/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2017/ToObject.js b/node_modules/es-abstract/2017/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2017/ToPrimitive.js b/node_modules/es-abstract/2017/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2017/ToPropertyDescriptor.js b/node_modules/es-abstract/2017/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2017/ToPropertyKey.js b/node_modules/es-abstract/2017/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2017/ToString.js b/node_modules/es-abstract/2017/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2017/ToUint16.js b/node_modules/es-abstract/2017/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2017/ToUint32.js b/node_modules/es-abstract/2017/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2017/ToUint8.js b/node_modules/es-abstract/2017/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2017/ToUint8Clamp.js b/node_modules/es-abstract/2017/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2017/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2017/Type.js b/node_modules/es-abstract/2017/Type.js
new file mode 100644
index 0000000..0bd1165
--- /dev/null
+++ b/node_modules/es-abstract/2017/Type.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2017/UTF16Decode.js b/node_modules/es-abstract/2017/UTF16Decode.js
new file mode 100644
index 0000000..86927b4
--- /dev/null
+++ b/node_modules/es-abstract/2017/UTF16Decode.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+// https://262.ecma-international.org/7.0/#sec-utf16decode
+
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair
+
+module.exports = function UTF16Decode(lead, trail) {
+	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
+		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
+	}
+	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+	return $fromCharCode(lead) + $fromCharCode(trail);
+};
diff --git a/node_modules/es-abstract/2017/UTF16Encoding.js b/node_modules/es-abstract/2017/UTF16Encoding.js
new file mode 100644
index 0000000..f381595
--- /dev/null
+++ b/node_modules/es-abstract/2017/UTF16Encoding.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var isCodePoint = require('../helpers/isCodePoint');
+
+// https://262.ecma-international.org/7.0/#sec-utf16encoding
+
+module.exports = function UTF16Encoding(cp) {
+	if (!isCodePoint(cp)) {
+		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
+	}
+	if (cp <= 65535) {
+		return $fromCharCode(cp);
+	}
+	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
+	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
+	return $fromCharCode(cu1) + $fromCharCode(cu2);
+};
diff --git a/node_modules/es-abstract/2017/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2017/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2017/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2017/WeekDay.js b/node_modules/es-abstract/2017/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2017/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2017/YearFromTime.js b/node_modules/es-abstract/2017/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2017/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2017/abs.js b/node_modules/es-abstract/2017/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2017/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2017/floor.js b/node_modules/es-abstract/2017/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2017/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2017/modulo.js b/node_modules/es-abstract/2017/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2017/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2017/msFromTime.js b/node_modules/es-abstract/2017/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2017/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2017/thisBooleanValue.js b/node_modules/es-abstract/2017/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2017/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2017/thisNumberValue.js b/node_modules/es-abstract/2017/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2017/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2017/thisStringValue.js b/node_modules/es-abstract/2017/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2017/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2017/thisTimeValue.js b/node_modules/es-abstract/2017/thisTimeValue.js
new file mode 100644
index 0000000..12548fa
--- /dev/null
+++ b/node_modules/es-abstract/2017/thisTimeValue.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $DateValueOf = require('call-bind/callBound')('Date.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
+
+module.exports = function thisTimeValue(value) {
+	return $DateValueOf(value);
+};
diff --git a/node_modules/es-abstract/2018/AbstractEqualityComparison.js b/node_modules/es-abstract/2018/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2018/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2018/AbstractRelationalComparison.js b/node_modules/es-abstract/2018/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2018/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2018/AdvanceStringIndex.js b/node_modules/es-abstract/2018/AdvanceStringIndex.js
new file mode 100644
index 0000000..279602b
--- /dev/null
+++ b/node_modules/es-abstract/2018/AdvanceStringIndex.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+
+	var first = $charCodeAt(S, index);
+	if (!isLeadingSurrogate(first)) {
+		return index + 1;
+	}
+
+	var second = $charCodeAt(S, index + 1);
+	if (!isTrailingSurrogate(second)) {
+		return index + 1;
+	}
+
+	return index + 2;
+};
diff --git a/node_modules/es-abstract/2018/ArrayCreate.js b/node_modules/es-abstract/2018/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2018/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2018/ArraySetLength.js b/node_modules/es-abstract/2018/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2018/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/ArraySpeciesCreate.js b/node_modules/es-abstract/2018/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2018/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2018/Call.js b/node_modules/es-abstract/2018/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2018/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2018/CanonicalNumericIndexString.js b/node_modules/es-abstract/2018/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2018/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2018/CompletePropertyDescriptor.js b/node_modules/es-abstract/2018/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2018/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2018/CopyDataProperties.js b/node_modules/es-abstract/2018/CopyDataProperties.js
new file mode 100644
index 0000000..b8f2802
--- /dev/null
+++ b/node_modules/es-abstract/2018/CopyDataProperties.js
@@ -0,0 +1,68 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToObject = require('./ToObject');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-copydataproperties
+
+module.exports = function CopyDataProperties(target, source, excludedItems) {
+	if (Type(target) !== 'Object') {
+		throw new $TypeError('Assertion failed: "target" must be an Object');
+	}
+
+	if (!IsArray(excludedItems)) {
+		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
+	}
+	for (var i = 0; i < excludedItems.length; i += 1) {
+		if (!IsPropertyKey(excludedItems[i])) {
+			throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
+		}
+	}
+
+	if (typeof source === 'undefined' || source === null) {
+		return target;
+	}
+
+	var fromObj = ToObject(source);
+
+	var sourceKeys = OwnPropertyKeys(fromObj);
+	forEach(sourceKeys, function (nextKey) {
+		var excluded = false;
+
+		forEach(excludedItems, function (e) {
+			if (SameValue(e, nextKey) === true) {
+				excluded = true;
+			}
+		});
+
+		var enumerable = $isEnumerable(fromObj, nextKey) || (
+		// this is to handle string keys being non-enumerable in older engines
+			typeof source === 'string'
+            && nextKey >= 0
+            && IsInteger(ToNumber(nextKey))
+		);
+		if (excluded === false && enumerable) {
+			var propValue = Get(fromObj, nextKey);
+			CreateDataProperty(target, nextKey, propValue);
+		}
+	});
+
+	return target;
+};
diff --git a/node_modules/es-abstract/2018/CreateDataProperty.js b/node_modules/es-abstract/2018/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2018/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2018/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2018/CreateHTML.js b/node_modules/es-abstract/2018/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2018/CreateIterResultObject.js b/node_modules/es-abstract/2018/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2018/CreateListFromArrayLike.js b/node_modules/es-abstract/2018/CreateListFromArrayLike.js
new file mode 100644
index 0000000..d1bb8b6
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateListFromArrayLike.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = ToLength(Get(obj, 'length'));
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2018/CreateMethodProperty.js b/node_modules/es-abstract/2018/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2018/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2018/DateFromTime.js b/node_modules/es-abstract/2018/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2018/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2018/DateString.js b/node_modules/es-abstract/2018/DateString.js
new file mode 100644
index 0000000..939c14c
--- /dev/null
+++ b/node_modules/es-abstract/2018/DateString.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var Type = require('./Type');
+var WeekDay = require('./WeekDay');
+var MonthFromTime = require('./MonthFromTime');
+var YearFromTime = require('./YearFromTime');
+var DateFromTime = require('./DateFromTime');
+
+// https://262.ecma-international.org/9.0/#sec-datestring
+
+module.exports = function DateString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var weekday = weekdays[WeekDay(tv)];
+	var month = months[MonthFromTime(tv)];
+	var day = padTimeComponent(DateFromTime(tv));
+	var year = padTimeComponent(YearFromTime(tv), 4);
+	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
+};
diff --git a/node_modules/es-abstract/2018/Day.js b/node_modules/es-abstract/2018/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2018/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2018/DayFromYear.js b/node_modules/es-abstract/2018/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2018/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2018/DayWithinYear.js b/node_modules/es-abstract/2018/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2018/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2018/DaysInYear.js b/node_modules/es-abstract/2018/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2018/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2018/DefinePropertyOrThrow.js b/node_modules/es-abstract/2018/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2018/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2018/DeletePropertyOrThrow.js b/node_modules/es-abstract/2018/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2018/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2018/EnumerableOwnPropertyNames.js b/node_modules/es-abstract/2018/EnumerableOwnPropertyNames.js
new file mode 100644
index 0000000..44171b9
--- /dev/null
+++ b/node_modules/es-abstract/2018/EnumerableOwnPropertyNames.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var objectKeys = require('object-keys');
+
+var callBound = require('call-bind/callBound');
+
+var callBind = require('call-bind');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
+
+var forEach = require('../helpers/forEach');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/8.0/#sec-enumerableownproperties
+
+module.exports = function EnumerableOwnProperties(O, kind) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	var keys = objectKeys(O);
+	if (kind === 'key') {
+		return keys;
+	}
+	if (kind === 'value' || kind === 'key+value') {
+		var results = [];
+		forEach(keys, function (key) {
+			if ($isEnumerable(O, key)) {
+				$pushApply(results, [
+					kind === 'value' ? O[key] : [key, O[key]]
+				]);
+			}
+		});
+		return results;
+	}
+	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
+};
diff --git a/node_modules/es-abstract/2018/FromPropertyDescriptor.js b/node_modules/es-abstract/2018/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2018/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2018/Get.js b/node_modules/es-abstract/2018/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2018/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2018/GetIterator.js b/node_modules/es-abstract/2018/GetIterator.js
new file mode 100644
index 0000000..a2d3b16
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetIterator.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+
+module.exports = function GetIterator(obj, method) {
+	var actualMethod = method;
+	if (arguments.length < 2) {
+		actualMethod = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray,
+				Type: Type
+			},
+			obj
+		);
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+};
diff --git a/node_modules/es-abstract/2018/GetMethod.js b/node_modules/es-abstract/2018/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2018/GetOwnPropertyKeys.js b/node_modules/es-abstract/2018/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2018/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2018/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2018/GetSubstitution.js b/node_modules/es-abstract/2018/GetSubstitution.js
new file mode 100644
index 0000000..a5a7a1b
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetSubstitution.js
@@ -0,0 +1,128 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var every = require('../helpers/every');
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+var $indexOf = callBound('String.prototype.indexOf');
+var $parseInt = parseInt;
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var inspect = require('object-inspect');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var ToObject = require('./ToObject');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// http://262.ecma-international.org/9.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+	if (Type(namedCaptures) !== 'Undefined') {
+		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
+	}
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else if (next === '<') {
+					// eslint-disable-next-line max-depth
+					if (Type(namedCaptures) === 'Undefined') {
+						result += '$<';
+						i += 2;
+					} else {
+						var endIndex = $indexOf(replacement, '>', i);
+						// eslint-disable-next-line max-depth
+						if (endIndex > -1) {
+							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
+							var capture = Get(namedCaptures, groupName);
+							// eslint-disable-next-line max-depth
+							if (Type(capture) !== 'Undefined') {
+								result += ToString(capture);
+							}
+							i += ('<' + groupName + '>').length;
+						}
+					}
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2018/GetV.js b/node_modules/es-abstract/2018/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2018/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2018/HasOwnProperty.js b/node_modules/es-abstract/2018/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2018/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2018/HasProperty.js b/node_modules/es-abstract/2018/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2018/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2018/HourFromTime.js b/node_modules/es-abstract/2018/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2018/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2018/InLeapYear.js b/node_modules/es-abstract/2018/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2018/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2018/InstanceofOperator.js b/node_modules/es-abstract/2018/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2018/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2018/Invoke.js b/node_modules/es-abstract/2018/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2018/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2018/IsAccessorDescriptor.js b/node_modules/es-abstract/2018/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/IsArray.js b/node_modules/es-abstract/2018/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2018/IsCallable.js b/node_modules/es-abstract/2018/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2018/IsConcatSpreadable.js b/node_modules/es-abstract/2018/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2018/IsConstructor.js b/node_modules/es-abstract/2018/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2018/IsDataDescriptor.js b/node_modules/es-abstract/2018/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/IsExtensible.js b/node_modules/es-abstract/2018/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2018/IsGenericDescriptor.js b/node_modules/es-abstract/2018/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2018/IsInteger.js b/node_modules/es-abstract/2018/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2018/IsPromise.js b/node_modules/es-abstract/2018/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/IsPropertyKey.js b/node_modules/es-abstract/2018/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2018/IsRegExp.js b/node_modules/es-abstract/2018/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2018/IsStringPrefix.js b/node_modules/es-abstract/2018/IsStringPrefix.js
new file mode 100644
index 0000000..4958544
--- /dev/null
+++ b/node_modules/es-abstract/2018/IsStringPrefix.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+// var callBound = require('call-bind/callBound');
+
+// var $charAt = callBound('String.prototype.charAt');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-isstringprefix
+
+module.exports = function IsStringPrefix(p, q) {
+	if (Type(p) !== 'String') {
+		throw new $TypeError('Assertion failed: "p" must be a String');
+	}
+
+	if (Type(q) !== 'String') {
+		throw new $TypeError('Assertion failed: "q" must be a String');
+	}
+
+	return isPrefixOf(p, q);
+	/*
+	if (p === q || p === '') {
+		return true;
+	}
+
+	var pLength = p.length;
+	var qLength = q.length;
+	if (pLength >= qLength) {
+		return false;
+	}
+
+	// assert: pLength < qLength
+
+	for (var i = 0; i < pLength; i += 1) {
+		if ($charAt(p, i) !== $charAt(q, i)) {
+			return false;
+		}
+	}
+	return true;
+	*/
+};
diff --git a/node_modules/es-abstract/2018/IterableToList.js b/node_modules/es-abstract/2018/IterableToList.js
new file mode 100644
index 0000000..6a1a6be
--- /dev/null
+++ b/node_modules/es-abstract/2018/IterableToList.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+var $arrayPush = callBound('Array.prototype.push');
+
+var GetIterator = require('./GetIterator');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+
+// https://262.ecma-international.org/8.0/#sec-iterabletolist
+
+module.exports = function IterableToList(items, method) {
+	var iterator = GetIterator(items, method);
+	var values = [];
+	var next = true;
+	while (next) {
+		next = IteratorStep(iterator);
+		if (next) {
+			var nextValue = IteratorValue(next);
+			$arrayPush(values, nextValue);
+		}
+	}
+	return values;
+};
diff --git a/node_modules/es-abstract/2018/IteratorClose.js b/node_modules/es-abstract/2018/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2018/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2018/IteratorComplete.js b/node_modules/es-abstract/2018/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2018/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2018/IteratorNext.js b/node_modules/es-abstract/2018/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2018/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2018/IteratorStep.js b/node_modules/es-abstract/2018/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2018/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2018/IteratorValue.js b/node_modules/es-abstract/2018/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2018/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2018/MakeDate.js b/node_modules/es-abstract/2018/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2018/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2018/MakeDay.js b/node_modules/es-abstract/2018/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2018/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2018/MakeTime.js b/node_modules/es-abstract/2018/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2018/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2018/MinFromTime.js b/node_modules/es-abstract/2018/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2018/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2018/MonthFromTime.js b/node_modules/es-abstract/2018/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2018/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2018/NumberToString.js b/node_modules/es-abstract/2018/NumberToString.js
new file mode 100644
index 0000000..b00c4bd
--- /dev/null
+++ b/node_modules/es-abstract/2018/NumberToString.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type
+
+module.exports = function NumberToString(m) {
+	if (Type(m) !== 'Number') {
+		throw new $TypeError('Assertion failed: "m" must be a String');
+	}
+
+	return $String(m);
+};
+
diff --git a/node_modules/es-abstract/2018/ObjectCreate.js b/node_modules/es-abstract/2018/ObjectCreate.js
new file mode 100644
index 0000000..2851a64
--- /dev/null
+++ b/node_modules/es-abstract/2018/ObjectCreate.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate
+
+module.exports = function ObjectCreate(proto, internalSlotsList) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var slots = arguments.length < 2 ? [] : internalSlotsList;
+	if (slots.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+	}
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2018/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..e2a299e
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var ObjectCreate = require('./ObjectCreate');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return ObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2018/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2018/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryGetPrototypeOf.js b/node_modules/es-abstract/2018/OrdinaryGetPrototypeOf.js
new file mode 100644
index 0000000..ba17b98
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryGetPrototypeOf.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $getProto = require('../helpers/getProto');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof
+
+module.exports = function OrdinaryGetPrototypeOf(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!$getProto) {
+		throw new $TypeError('This environment does not support fetching prototypes.');
+	}
+	return $getProto(O);
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryHasInstance.js b/node_modules/es-abstract/2018/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2018/OrdinaryHasProperty.js b/node_modules/es-abstract/2018/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2018/OrdinarySetPrototypeOf.js b/node_modules/es-abstract/2018/OrdinarySetPrototypeOf.js
new file mode 100644
index 0000000..d0ff7a7
--- /dev/null
+++ b/node_modules/es-abstract/2018/OrdinarySetPrototypeOf.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $setProto = require('../helpers/setProto');
+
+var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof
+
+module.exports = function OrdinarySetPrototypeOf(O, V) {
+	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
+		throw new $TypeError('Assertion failed: V must be Object or Null');
+	}
+	/*
+    var extensible = IsExtensible(O);
+    var current = OrdinaryGetPrototypeOf(O);
+    if (SameValue(V, current)) {
+        return true;
+    }
+    if (!extensible) {
+        return false;
+    }
+    */
+	try {
+		$setProto(O, V);
+	} catch (e) {
+		return false;
+	}
+	return OrdinaryGetPrototypeOf(O) === V;
+	/*
+    var p = V;
+    var done = false;
+    while (!done) {
+        if (p === null) {
+            done = true;
+        } else if (SameValue(p, O)) {
+            return false;
+        } else {
+            if (wat) {
+                done = true;
+            } else {
+                p = p.[[Prototype]];
+            }
+        }
+     }
+     O.[[Prototype]] = V;
+     return true;
+     */
+};
diff --git a/node_modules/es-abstract/2018/PromiseResolve.js b/node_modules/es-abstract/2018/PromiseResolve.js
new file mode 100644
index 0000000..6474b79
--- /dev/null
+++ b/node_modules/es-abstract/2018/PromiseResolve.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBind = require('call-bind');
+
+var $resolve = GetIntrinsic('%Promise.resolve%', true);
+var $PromiseResolve = $resolve && callBind($resolve);
+
+// https://262.ecma-international.org/9.0/#sec-promise-resolve
+
+module.exports = function PromiseResolve(C, x) {
+	if (!$PromiseResolve) {
+		throw new SyntaxError('This environment does not support Promises.');
+	}
+	return $PromiseResolve(C, x);
+};
+
diff --git a/node_modules/es-abstract/2018/QuoteJSONString.js b/node_modules/es-abstract/2018/QuoteJSONString.js
new file mode 100644
index 0000000..99eea61
--- /dev/null
+++ b/node_modules/es-abstract/2018/QuoteJSONString.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $strSplit = callBound('String.prototype.split');
+
+var Type = require('./Type');
+var UnicodeEscape = require('./UnicodeEscape');
+
+var has = require('has');
+
+// https://262.ecma-international.org/9.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': '\\b',
+	'\u0009': '\\t',
+	'\u000A': '\\n',
+	'\u000C': '\\f',
+	'\u000D': '\\r',
+	'\u0022': '\\"',
+	'\u005c': '\\\\'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach($strSplit(value), function (C) {
+			if (has(escapes, C)) {
+				product += escapes[C];
+			} else if ($charCodeAt(C, 0) < 0x20) {
+				product += UnicodeEscape(C);
+			} else {
+				product += C;
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2018/RegExpCreate.js b/node_modules/es-abstract/2018/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2018/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2018/RegExpExec.js b/node_modules/es-abstract/2018/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2018/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2018/RequireObjectCoercible.js b/node_modules/es-abstract/2018/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2018/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2018/SameValue.js b/node_modules/es-abstract/2018/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2018/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2018/SameValueNonNumber.js b/node_modules/es-abstract/2018/SameValueNonNumber.js
new file mode 100644
index 0000000..b6d2c4e
--- /dev/null
+++ b/node_modules/es-abstract/2018/SameValueNonNumber.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+
+// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber
+
+module.exports = function SameValueNonNumber(x, y) {
+	if (typeof x === 'number' || typeof x !== typeof y) {
+		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
+	}
+	return SameValue(x, y);
+};
diff --git a/node_modules/es-abstract/2018/SameValueZero.js b/node_modules/es-abstract/2018/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2018/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2018/SecFromTime.js b/node_modules/es-abstract/2018/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2018/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2018/Set.js b/node_modules/es-abstract/2018/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2018/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2018/SetFunctionLength.js b/node_modules/es-abstract/2018/SetFunctionLength.js
new file mode 100644
index 0000000..c1160c8
--- /dev/null
+++ b/node_modules/es-abstract/2018/SetFunctionLength.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var HasOwnProperty = require('./HasOwnProperty');
+var IsExtensible = require('./IsExtensible');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-setfunctionlength
+
+module.exports = function SetFunctionLength(F, length) {
+	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
+		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
+	}
+	if (Type(length) !== 'Number') {
+		throw new $TypeError('Assertion failed: `length` must be a Number');
+	}
+	if (length < 0 || !IsInteger(length)) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
+	}
+	return DefinePropertyOrThrow(F, 'length', {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+};
diff --git a/node_modules/es-abstract/2018/SetFunctionName.js b/node_modules/es-abstract/2018/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2018/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2018/SetIntegrityLevel.js b/node_modules/es-abstract/2018/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2018/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/SpeciesConstructor.js b/node_modules/es-abstract/2018/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2018/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2018/SplitMatch.js b/node_modules/es-abstract/2018/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2018/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2018/StrictEqualityComparison.js b/node_modules/es-abstract/2018/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2018/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2018/StringCreate.js b/node_modules/es-abstract/2018/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2018/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2018/StringGetOwnProperty.js b/node_modules/es-abstract/2018/StringGetOwnProperty.js
new file mode 100644
index 0000000..b6f904e
--- /dev/null
+++ b/node_modules/es-abstract/2018/StringGetOwnProperty.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var $charAt = callBound('String.prototype.charAt');
+var $stringToString = callBound('String.prototype.toString');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+var isNegativeZero = require('is-negative-zero');
+
+// https://262.ecma-international.org/8.0/#sec-stringgetownproperty
+
+module.exports = function StringGetOwnProperty(S, P) {
+	var str;
+	if (Type(S) === 'Object') {
+		try {
+			str = $stringToString(S);
+		} catch (e) { /**/ }
+	}
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+	var index = CanonicalNumericIndexString(P);
+	var len = str.length;
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
+		return void undefined;
+	}
+	var resultStr = $charAt(S, index);
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2018/SymbolDescriptiveString.js b/node_modules/es-abstract/2018/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2018/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2018/TestIntegrityLevel.js b/node_modules/es-abstract/2018/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2018/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2018/TimeClip.js b/node_modules/es-abstract/2018/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2018/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2018/TimeFromYear.js b/node_modules/es-abstract/2018/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2018/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2018/TimeString.js b/node_modules/es-abstract/2018/TimeString.js
new file mode 100644
index 0000000..051c472
--- /dev/null
+++ b/node_modules/es-abstract/2018/TimeString.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var HourFromTime = require('./HourFromTime');
+var MinFromTime = require('./MinFromTime');
+var SecFromTime = require('./SecFromTime');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-timestring
+
+module.exports = function TimeString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var hour = HourFromTime(tv);
+	var minute = MinFromTime(tv);
+	var second = SecFromTime(tv);
+	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
+};
diff --git a/node_modules/es-abstract/2018/TimeWithinDay.js b/node_modules/es-abstract/2018/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2018/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2018/ToBoolean.js b/node_modules/es-abstract/2018/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2018/ToDateString.js b/node_modules/es-abstract/2018/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2018/ToIndex.js b/node_modules/es-abstract/2018/ToIndex.js
new file mode 100644
index 0000000..7c9d746
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToIndex.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+
+var ToInteger = require('./ToInteger');
+var ToLength = require('./ToLength');
+var SameValueZero = require('./SameValueZero');
+
+// https://262.ecma-international.org/8.0/#sec-toindex
+
+module.exports = function ToIndex(value) {
+	if (typeof value === 'undefined') {
+		return 0;
+	}
+	var integerIndex = ToInteger(value);
+	if (integerIndex < 0) {
+		throw new $RangeError('index must be >= 0');
+	}
+	var index = ToLength(integerIndex);
+	if (!SameValueZero(integerIndex, index)) {
+		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
+	}
+	return index;
+};
diff --git a/node_modules/es-abstract/2018/ToInt16.js b/node_modules/es-abstract/2018/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2018/ToInt32.js b/node_modules/es-abstract/2018/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2018/ToInt8.js b/node_modules/es-abstract/2018/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2018/ToInteger.js b/node_modules/es-abstract/2018/ToInteger.js
new file mode 100644
index 0000000..2975818
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToInteger.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	return ES5ToInteger(number);
+};
diff --git a/node_modules/es-abstract/2018/ToLength.js b/node_modules/es-abstract/2018/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2018/ToNumber.js b/node_modules/es-abstract/2018/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2018/ToObject.js b/node_modules/es-abstract/2018/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2018/ToPrimitive.js b/node_modules/es-abstract/2018/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2018/ToPropertyDescriptor.js b/node_modules/es-abstract/2018/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2018/ToPropertyKey.js b/node_modules/es-abstract/2018/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2018/ToString.js b/node_modules/es-abstract/2018/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2018/ToUint16.js b/node_modules/es-abstract/2018/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2018/ToUint32.js b/node_modules/es-abstract/2018/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2018/ToUint8.js b/node_modules/es-abstract/2018/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2018/ToUint8Clamp.js b/node_modules/es-abstract/2018/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2018/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2018/Type.js b/node_modules/es-abstract/2018/Type.js
new file mode 100644
index 0000000..0bd1165
--- /dev/null
+++ b/node_modules/es-abstract/2018/Type.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2018/UTF16Decode.js b/node_modules/es-abstract/2018/UTF16Decode.js
new file mode 100644
index 0000000..86927b4
--- /dev/null
+++ b/node_modules/es-abstract/2018/UTF16Decode.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+// https://262.ecma-international.org/7.0/#sec-utf16decode
+
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair
+
+module.exports = function UTF16Decode(lead, trail) {
+	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
+		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
+	}
+	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+	return $fromCharCode(lead) + $fromCharCode(trail);
+};
diff --git a/node_modules/es-abstract/2018/UTF16Encoding.js b/node_modules/es-abstract/2018/UTF16Encoding.js
new file mode 100644
index 0000000..f381595
--- /dev/null
+++ b/node_modules/es-abstract/2018/UTF16Encoding.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var isCodePoint = require('../helpers/isCodePoint');
+
+// https://262.ecma-international.org/7.0/#sec-utf16encoding
+
+module.exports = function UTF16Encoding(cp) {
+	if (!isCodePoint(cp)) {
+		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
+	}
+	if (cp <= 65535) {
+		return $fromCharCode(cp);
+	}
+	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
+	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
+	return $fromCharCode(cu1) + $fromCharCode(cu2);
+};
diff --git a/node_modules/es-abstract/2018/UnicodeEscape.js b/node_modules/es-abstract/2018/UnicodeEscape.js
new file mode 100644
index 0000000..db7163f
--- /dev/null
+++ b/node_modules/es-abstract/2018/UnicodeEscape.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+var $strSlice = callBound('String.prototype.slice');
+
+// https://262.ecma-international.org/9.0/#sec-unicodeescape
+
+module.exports = function UnicodeEscape(C) {
+	if (typeof C !== 'string' || C.length !== 1) {
+		throw new $TypeError('Assertion failed: `C` must be a single code unit');
+	}
+	var n = $charCodeAt(C, 0);
+	if (n > 0xFFFF) {
+		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
+	}
+
+	return '\\u' + $strSlice('0000' + $toLowerCase($numberToString(n, 16)), -4);
+};
diff --git a/node_modules/es-abstract/2018/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2018/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2018/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2018/WeekDay.js b/node_modules/es-abstract/2018/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2018/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2018/YearFromTime.js b/node_modules/es-abstract/2018/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2018/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2018/abs.js b/node_modules/es-abstract/2018/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2018/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2018/floor.js b/node_modules/es-abstract/2018/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2018/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2018/modulo.js b/node_modules/es-abstract/2018/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2018/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2018/msFromTime.js b/node_modules/es-abstract/2018/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2018/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2018/thisBooleanValue.js b/node_modules/es-abstract/2018/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2018/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2018/thisNumberValue.js b/node_modules/es-abstract/2018/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2018/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2018/thisStringValue.js b/node_modules/es-abstract/2018/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2018/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2018/thisSymbolValue.js b/node_modules/es-abstract/2018/thisSymbolValue.js
new file mode 100644
index 0000000..91a5525
--- /dev/null
+++ b/node_modules/es-abstract/2018/thisSymbolValue.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-thissymbolvalue
+
+module.exports = function thisSymbolValue(value) {
+	if (!$SymbolValueOf) {
+		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
+	}
+	if (Type(value) === 'Symbol') {
+		return value;
+	}
+	return $SymbolValueOf(value);
+};
diff --git a/node_modules/es-abstract/2018/thisTimeValue.js b/node_modules/es-abstract/2018/thisTimeValue.js
new file mode 100644
index 0000000..12548fa
--- /dev/null
+++ b/node_modules/es-abstract/2018/thisTimeValue.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $DateValueOf = require('call-bind/callBound')('Date.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
+
+module.exports = function thisTimeValue(value) {
+	return $DateValueOf(value);
+};
diff --git a/node_modules/es-abstract/2019/AbstractEqualityComparison.js b/node_modules/es-abstract/2019/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2019/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2019/AbstractRelationalComparison.js b/node_modules/es-abstract/2019/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2019/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2019/AddEntriesFromIterable.js b/node_modules/es-abstract/2019/AddEntriesFromIterable.js
new file mode 100644
index 0000000..a0a5e71
--- /dev/null
+++ b/node_modules/es-abstract/2019/AddEntriesFromIterable.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var inspect = require('object-inspect');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var GetIterator = require('./GetIterator');
+var IsCallable = require('./IsCallable');
+var IteratorClose = require('./IteratorClose');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable
+
+module.exports = function AddEntriesFromIterable(target, iterable, adder) {
+	if (!IsCallable(adder)) {
+		throw new $TypeError('Assertion failed: `adder` is not callable');
+	}
+	if (iterable == null) {
+		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
+	}
+	var iteratorRecord = GetIterator(iterable);
+	while (true) { // eslint-disable-line no-constant-condition
+		var next = IteratorStep(iteratorRecord);
+		if (!next) {
+			return target;
+		}
+		var nextItem = IteratorValue(next);
+		if (Type(nextItem) !== 'Object') {
+			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
+			return IteratorClose(
+				iteratorRecord,
+				function () { throw error; } // eslint-disable-line no-loop-func
+			);
+		}
+		try {
+			var k = Get(nextItem, '0');
+			var v = Get(nextItem, '1');
+			Call(adder, target, [k, v]);
+		} catch (e) {
+			return IteratorClose(
+				iteratorRecord,
+				function () { throw e; }
+			);
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2019/AdvanceStringIndex.js b/node_modules/es-abstract/2019/AdvanceStringIndex.js
new file mode 100644
index 0000000..279602b
--- /dev/null
+++ b/node_modules/es-abstract/2019/AdvanceStringIndex.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+
+	var first = $charCodeAt(S, index);
+	if (!isLeadingSurrogate(first)) {
+		return index + 1;
+	}
+
+	var second = $charCodeAt(S, index + 1);
+	if (!isTrailingSurrogate(second)) {
+		return index + 1;
+	}
+
+	return index + 2;
+};
diff --git a/node_modules/es-abstract/2019/ArrayCreate.js b/node_modules/es-abstract/2019/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2019/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2019/ArraySetLength.js b/node_modules/es-abstract/2019/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2019/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/ArraySpeciesCreate.js b/node_modules/es-abstract/2019/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2019/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2019/Call.js b/node_modules/es-abstract/2019/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2019/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2019/CanonicalNumericIndexString.js b/node_modules/es-abstract/2019/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2019/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2019/CompletePropertyDescriptor.js b/node_modules/es-abstract/2019/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2019/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2019/CopyDataProperties.js b/node_modules/es-abstract/2019/CopyDataProperties.js
new file mode 100644
index 0000000..b8f2802
--- /dev/null
+++ b/node_modules/es-abstract/2019/CopyDataProperties.js
@@ -0,0 +1,68 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToObject = require('./ToObject');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-copydataproperties
+
+module.exports = function CopyDataProperties(target, source, excludedItems) {
+	if (Type(target) !== 'Object') {
+		throw new $TypeError('Assertion failed: "target" must be an Object');
+	}
+
+	if (!IsArray(excludedItems)) {
+		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
+	}
+	for (var i = 0; i < excludedItems.length; i += 1) {
+		if (!IsPropertyKey(excludedItems[i])) {
+			throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
+		}
+	}
+
+	if (typeof source === 'undefined' || source === null) {
+		return target;
+	}
+
+	var fromObj = ToObject(source);
+
+	var sourceKeys = OwnPropertyKeys(fromObj);
+	forEach(sourceKeys, function (nextKey) {
+		var excluded = false;
+
+		forEach(excludedItems, function (e) {
+			if (SameValue(e, nextKey) === true) {
+				excluded = true;
+			}
+		});
+
+		var enumerable = $isEnumerable(fromObj, nextKey) || (
+		// this is to handle string keys being non-enumerable in older engines
+			typeof source === 'string'
+            && nextKey >= 0
+            && IsInteger(ToNumber(nextKey))
+		);
+		if (excluded === false && enumerable) {
+			var propValue = Get(fromObj, nextKey);
+			CreateDataProperty(target, nextKey, propValue);
+		}
+	});
+
+	return target;
+};
diff --git a/node_modules/es-abstract/2019/CreateDataProperty.js b/node_modules/es-abstract/2019/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2019/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2019/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2019/CreateHTML.js b/node_modules/es-abstract/2019/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2019/CreateIterResultObject.js b/node_modules/es-abstract/2019/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2019/CreateListFromArrayLike.js b/node_modules/es-abstract/2019/CreateListFromArrayLike.js
new file mode 100644
index 0000000..d1bb8b6
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateListFromArrayLike.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = ToLength(Get(obj, 'length'));
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2019/CreateMethodProperty.js b/node_modules/es-abstract/2019/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2019/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2019/DateFromTime.js b/node_modules/es-abstract/2019/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2019/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2019/DateString.js b/node_modules/es-abstract/2019/DateString.js
new file mode 100644
index 0000000..939c14c
--- /dev/null
+++ b/node_modules/es-abstract/2019/DateString.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var Type = require('./Type');
+var WeekDay = require('./WeekDay');
+var MonthFromTime = require('./MonthFromTime');
+var YearFromTime = require('./YearFromTime');
+var DateFromTime = require('./DateFromTime');
+
+// https://262.ecma-international.org/9.0/#sec-datestring
+
+module.exports = function DateString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var weekday = weekdays[WeekDay(tv)];
+	var month = months[MonthFromTime(tv)];
+	var day = padTimeComponent(DateFromTime(tv));
+	var year = padTimeComponent(YearFromTime(tv), 4);
+	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
+};
diff --git a/node_modules/es-abstract/2019/Day.js b/node_modules/es-abstract/2019/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2019/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2019/DayFromYear.js b/node_modules/es-abstract/2019/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2019/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2019/DayWithinYear.js b/node_modules/es-abstract/2019/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2019/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2019/DaysInYear.js b/node_modules/es-abstract/2019/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2019/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2019/DefinePropertyOrThrow.js b/node_modules/es-abstract/2019/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2019/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2019/DeletePropertyOrThrow.js b/node_modules/es-abstract/2019/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2019/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2019/EnumerableOwnPropertyNames.js b/node_modules/es-abstract/2019/EnumerableOwnPropertyNames.js
new file mode 100644
index 0000000..44171b9
--- /dev/null
+++ b/node_modules/es-abstract/2019/EnumerableOwnPropertyNames.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var objectKeys = require('object-keys');
+
+var callBound = require('call-bind/callBound');
+
+var callBind = require('call-bind');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
+
+var forEach = require('../helpers/forEach');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/8.0/#sec-enumerableownproperties
+
+module.exports = function EnumerableOwnProperties(O, kind) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	var keys = objectKeys(O);
+	if (kind === 'key') {
+		return keys;
+	}
+	if (kind === 'value' || kind === 'key+value') {
+		var results = [];
+		forEach(keys, function (key) {
+			if ($isEnumerable(O, key)) {
+				$pushApply(results, [
+					kind === 'value' ? O[key] : [key, O[key]]
+				]);
+			}
+		});
+		return results;
+	}
+	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
+};
diff --git a/node_modules/es-abstract/2019/FlattenIntoArray.js b/node_modules/es-abstract/2019/FlattenIntoArray.js
new file mode 100644
index 0000000..ffe5fcd
--- /dev/null
+++ b/node_modules/es-abstract/2019/FlattenIntoArray.js
@@ -0,0 +1,58 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var Call = require('./Call');
+var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
+var Get = require('./Get');
+var HasProperty = require('./HasProperty');
+var IsArray = require('./IsArray');
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/10.0/#sec-flattenintoarray
+
+// eslint-disable-next-line max-params
+module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
+	var mapperFunction;
+	if (arguments.length > 5) {
+		mapperFunction = arguments[5];
+	}
+
+	var targetIndex = start;
+	var sourceIndex = 0;
+	while (sourceIndex < sourceLen) {
+		var P = ToString(sourceIndex);
+		var exists = HasProperty(source, P);
+		if (exists === true) {
+			var element = Get(source, P);
+			if (typeof mapperFunction !== 'undefined') {
+				if (arguments.length <= 6) {
+					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
+				}
+				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
+			}
+			var shouldFlatten = false;
+			if (depth > 0) {
+				shouldFlatten = IsArray(element);
+			}
+			if (shouldFlatten) {
+				var elementLen = ToLength(Get(element, 'length'));
+				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
+			} else {
+				if (targetIndex >= MAX_SAFE_INTEGER) {
+					throw new $TypeError('index too large');
+				}
+				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
+				targetIndex += 1;
+			}
+		}
+		sourceIndex += 1;
+	}
+
+	return targetIndex;
+};
diff --git a/node_modules/es-abstract/2019/FromPropertyDescriptor.js b/node_modules/es-abstract/2019/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2019/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2019/Get.js b/node_modules/es-abstract/2019/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2019/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2019/GetIterator.js b/node_modules/es-abstract/2019/GetIterator.js
new file mode 100644
index 0000000..a2d3b16
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetIterator.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+
+module.exports = function GetIterator(obj, method) {
+	var actualMethod = method;
+	if (arguments.length < 2) {
+		actualMethod = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray,
+				Type: Type
+			},
+			obj
+		);
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+};
diff --git a/node_modules/es-abstract/2019/GetMethod.js b/node_modules/es-abstract/2019/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2019/GetOwnPropertyKeys.js b/node_modules/es-abstract/2019/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2019/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2019/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2019/GetSubstitution.js b/node_modules/es-abstract/2019/GetSubstitution.js
new file mode 100644
index 0000000..a5a7a1b
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetSubstitution.js
@@ -0,0 +1,128 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var every = require('../helpers/every');
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+var $indexOf = callBound('String.prototype.indexOf');
+var $parseInt = parseInt;
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var inspect = require('object-inspect');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var ToObject = require('./ToObject');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// http://262.ecma-international.org/9.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+	if (Type(namedCaptures) !== 'Undefined') {
+		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
+	}
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else if (next === '<') {
+					// eslint-disable-next-line max-depth
+					if (Type(namedCaptures) === 'Undefined') {
+						result += '$<';
+						i += 2;
+					} else {
+						var endIndex = $indexOf(replacement, '>', i);
+						// eslint-disable-next-line max-depth
+						if (endIndex > -1) {
+							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
+							var capture = Get(namedCaptures, groupName);
+							// eslint-disable-next-line max-depth
+							if (Type(capture) !== 'Undefined') {
+								result += ToString(capture);
+							}
+							i += ('<' + groupName + '>').length;
+						}
+					}
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2019/GetV.js b/node_modules/es-abstract/2019/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2019/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2019/HasOwnProperty.js b/node_modules/es-abstract/2019/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2019/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2019/HasProperty.js b/node_modules/es-abstract/2019/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2019/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2019/HourFromTime.js b/node_modules/es-abstract/2019/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2019/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2019/InLeapYear.js b/node_modules/es-abstract/2019/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2019/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2019/InstanceofOperator.js b/node_modules/es-abstract/2019/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2019/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2019/Invoke.js b/node_modules/es-abstract/2019/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2019/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2019/IsAccessorDescriptor.js b/node_modules/es-abstract/2019/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/IsArray.js b/node_modules/es-abstract/2019/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2019/IsCallable.js b/node_modules/es-abstract/2019/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2019/IsConcatSpreadable.js b/node_modules/es-abstract/2019/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2019/IsConstructor.js b/node_modules/es-abstract/2019/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2019/IsDataDescriptor.js b/node_modules/es-abstract/2019/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/IsExtensible.js b/node_modules/es-abstract/2019/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2019/IsGenericDescriptor.js b/node_modules/es-abstract/2019/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2019/IsInteger.js b/node_modules/es-abstract/2019/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2019/IsPromise.js b/node_modules/es-abstract/2019/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/IsPropertyKey.js b/node_modules/es-abstract/2019/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2019/IsRegExp.js b/node_modules/es-abstract/2019/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2019/IsStringPrefix.js b/node_modules/es-abstract/2019/IsStringPrefix.js
new file mode 100644
index 0000000..4958544
--- /dev/null
+++ b/node_modules/es-abstract/2019/IsStringPrefix.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+// var callBound = require('call-bind/callBound');
+
+// var $charAt = callBound('String.prototype.charAt');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-isstringprefix
+
+module.exports = function IsStringPrefix(p, q) {
+	if (Type(p) !== 'String') {
+		throw new $TypeError('Assertion failed: "p" must be a String');
+	}
+
+	if (Type(q) !== 'String') {
+		throw new $TypeError('Assertion failed: "q" must be a String');
+	}
+
+	return isPrefixOf(p, q);
+	/*
+	if (p === q || p === '') {
+		return true;
+	}
+
+	var pLength = p.length;
+	var qLength = q.length;
+	if (pLength >= qLength) {
+		return false;
+	}
+
+	// assert: pLength < qLength
+
+	for (var i = 0; i < pLength; i += 1) {
+		if ($charAt(p, i) !== $charAt(q, i)) {
+			return false;
+		}
+	}
+	return true;
+	*/
+};
diff --git a/node_modules/es-abstract/2019/IterableToList.js b/node_modules/es-abstract/2019/IterableToList.js
new file mode 100644
index 0000000..6a1a6be
--- /dev/null
+++ b/node_modules/es-abstract/2019/IterableToList.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+var $arrayPush = callBound('Array.prototype.push');
+
+var GetIterator = require('./GetIterator');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+
+// https://262.ecma-international.org/8.0/#sec-iterabletolist
+
+module.exports = function IterableToList(items, method) {
+	var iterator = GetIterator(items, method);
+	var values = [];
+	var next = true;
+	while (next) {
+		next = IteratorStep(iterator);
+		if (next) {
+			var nextValue = IteratorValue(next);
+			$arrayPush(values, nextValue);
+		}
+	}
+	return values;
+};
diff --git a/node_modules/es-abstract/2019/IteratorClose.js b/node_modules/es-abstract/2019/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2019/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2019/IteratorComplete.js b/node_modules/es-abstract/2019/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2019/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2019/IteratorNext.js b/node_modules/es-abstract/2019/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2019/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2019/IteratorStep.js b/node_modules/es-abstract/2019/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2019/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2019/IteratorValue.js b/node_modules/es-abstract/2019/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2019/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2019/MakeDate.js b/node_modules/es-abstract/2019/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2019/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2019/MakeDay.js b/node_modules/es-abstract/2019/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2019/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2019/MakeTime.js b/node_modules/es-abstract/2019/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2019/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2019/MinFromTime.js b/node_modules/es-abstract/2019/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2019/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2019/MonthFromTime.js b/node_modules/es-abstract/2019/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2019/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2019/NumberToString.js b/node_modules/es-abstract/2019/NumberToString.js
new file mode 100644
index 0000000..b00c4bd
--- /dev/null
+++ b/node_modules/es-abstract/2019/NumberToString.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type
+
+module.exports = function NumberToString(m) {
+	if (Type(m) !== 'Number') {
+		throw new $TypeError('Assertion failed: "m" must be a String');
+	}
+
+	return $String(m);
+};
+
diff --git a/node_modules/es-abstract/2019/ObjectCreate.js b/node_modules/es-abstract/2019/ObjectCreate.js
new file mode 100644
index 0000000..2851a64
--- /dev/null
+++ b/node_modules/es-abstract/2019/ObjectCreate.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate
+
+module.exports = function ObjectCreate(proto, internalSlotsList) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var slots = arguments.length < 2 ? [] : internalSlotsList;
+	if (slots.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+	}
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2019/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..e2a299e
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var ObjectCreate = require('./ObjectCreate');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return ObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2019/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2019/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryGetPrototypeOf.js b/node_modules/es-abstract/2019/OrdinaryGetPrototypeOf.js
new file mode 100644
index 0000000..ba17b98
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryGetPrototypeOf.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $getProto = require('../helpers/getProto');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof
+
+module.exports = function OrdinaryGetPrototypeOf(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!$getProto) {
+		throw new $TypeError('This environment does not support fetching prototypes.');
+	}
+	return $getProto(O);
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryHasInstance.js b/node_modules/es-abstract/2019/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2019/OrdinaryHasProperty.js b/node_modules/es-abstract/2019/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2019/OrdinarySetPrototypeOf.js b/node_modules/es-abstract/2019/OrdinarySetPrototypeOf.js
new file mode 100644
index 0000000..d0ff7a7
--- /dev/null
+++ b/node_modules/es-abstract/2019/OrdinarySetPrototypeOf.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $setProto = require('../helpers/setProto');
+
+var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof
+
+module.exports = function OrdinarySetPrototypeOf(O, V) {
+	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
+		throw new $TypeError('Assertion failed: V must be Object or Null');
+	}
+	/*
+    var extensible = IsExtensible(O);
+    var current = OrdinaryGetPrototypeOf(O);
+    if (SameValue(V, current)) {
+        return true;
+    }
+    if (!extensible) {
+        return false;
+    }
+    */
+	try {
+		$setProto(O, V);
+	} catch (e) {
+		return false;
+	}
+	return OrdinaryGetPrototypeOf(O) === V;
+	/*
+    var p = V;
+    var done = false;
+    while (!done) {
+        if (p === null) {
+            done = true;
+        } else if (SameValue(p, O)) {
+            return false;
+        } else {
+            if (wat) {
+                done = true;
+            } else {
+                p = p.[[Prototype]];
+            }
+        }
+     }
+     O.[[Prototype]] = V;
+     return true;
+     */
+};
diff --git a/node_modules/es-abstract/2019/PromiseResolve.js b/node_modules/es-abstract/2019/PromiseResolve.js
new file mode 100644
index 0000000..6474b79
--- /dev/null
+++ b/node_modules/es-abstract/2019/PromiseResolve.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBind = require('call-bind');
+
+var $resolve = GetIntrinsic('%Promise.resolve%', true);
+var $PromiseResolve = $resolve && callBind($resolve);
+
+// https://262.ecma-international.org/9.0/#sec-promise-resolve
+
+module.exports = function PromiseResolve(C, x) {
+	if (!$PromiseResolve) {
+		throw new SyntaxError('This environment does not support Promises.');
+	}
+	return $PromiseResolve(C, x);
+};
+
diff --git a/node_modules/es-abstract/2019/QuoteJSONString.js b/node_modules/es-abstract/2019/QuoteJSONString.js
new file mode 100644
index 0000000..350fd51
--- /dev/null
+++ b/node_modules/es-abstract/2019/QuoteJSONString.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $strSplit = callBound('String.prototype.split');
+
+var Type = require('./Type');
+var UnicodeEscape = require('./UnicodeEscape');
+var UTF16Encoding = require('./UTF16Encoding');
+
+var has = require('has');
+
+// https://262.ecma-international.org/10.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': '\\b',
+	'\u0009': '\\t',
+	'\u000A': '\\n',
+	'\u000C': '\\f',
+	'\u000D': '\\r',
+	'\u0022': '\\"',
+	'\u005c': '\\\\'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach($strSplit(value), function (C) {
+			if (has(escapes, C)) {
+				product += escapes[C];
+			} else {
+				var cCharCode = $charCodeAt(C, 0);
+				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
+					product += UnicodeEscape(C);
+				} else {
+					product += UTF16Encoding(cCharCode);
+				}
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2019/RegExpCreate.js b/node_modules/es-abstract/2019/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2019/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2019/RegExpExec.js b/node_modules/es-abstract/2019/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2019/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2019/RequireObjectCoercible.js b/node_modules/es-abstract/2019/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2019/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2019/SameValue.js b/node_modules/es-abstract/2019/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2019/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2019/SameValueNonNumber.js b/node_modules/es-abstract/2019/SameValueNonNumber.js
new file mode 100644
index 0000000..b6d2c4e
--- /dev/null
+++ b/node_modules/es-abstract/2019/SameValueNonNumber.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+
+// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber
+
+module.exports = function SameValueNonNumber(x, y) {
+	if (typeof x === 'number' || typeof x !== typeof y) {
+		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
+	}
+	return SameValue(x, y);
+};
diff --git a/node_modules/es-abstract/2019/SameValueZero.js b/node_modules/es-abstract/2019/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2019/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2019/SecFromTime.js b/node_modules/es-abstract/2019/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2019/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2019/Set.js b/node_modules/es-abstract/2019/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2019/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2019/SetFunctionLength.js b/node_modules/es-abstract/2019/SetFunctionLength.js
new file mode 100644
index 0000000..c1160c8
--- /dev/null
+++ b/node_modules/es-abstract/2019/SetFunctionLength.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var HasOwnProperty = require('./HasOwnProperty');
+var IsExtensible = require('./IsExtensible');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-setfunctionlength
+
+module.exports = function SetFunctionLength(F, length) {
+	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
+		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
+	}
+	if (Type(length) !== 'Number') {
+		throw new $TypeError('Assertion failed: `length` must be a Number');
+	}
+	if (length < 0 || !IsInteger(length)) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
+	}
+	return DefinePropertyOrThrow(F, 'length', {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+};
diff --git a/node_modules/es-abstract/2019/SetFunctionName.js b/node_modules/es-abstract/2019/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2019/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2019/SetIntegrityLevel.js b/node_modules/es-abstract/2019/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2019/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/SpeciesConstructor.js b/node_modules/es-abstract/2019/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2019/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2019/SplitMatch.js b/node_modules/es-abstract/2019/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2019/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2019/StrictEqualityComparison.js b/node_modules/es-abstract/2019/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2019/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2019/StringCreate.js b/node_modules/es-abstract/2019/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2019/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2019/StringGetOwnProperty.js b/node_modules/es-abstract/2019/StringGetOwnProperty.js
new file mode 100644
index 0000000..b6f904e
--- /dev/null
+++ b/node_modules/es-abstract/2019/StringGetOwnProperty.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var $charAt = callBound('String.prototype.charAt');
+var $stringToString = callBound('String.prototype.toString');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+var isNegativeZero = require('is-negative-zero');
+
+// https://262.ecma-international.org/8.0/#sec-stringgetownproperty
+
+module.exports = function StringGetOwnProperty(S, P) {
+	var str;
+	if (Type(S) === 'Object') {
+		try {
+			str = $stringToString(S);
+		} catch (e) { /**/ }
+	}
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+	var index = CanonicalNumericIndexString(P);
+	var len = str.length;
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
+		return void undefined;
+	}
+	var resultStr = $charAt(S, index);
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2019/SymbolDescriptiveString.js b/node_modules/es-abstract/2019/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2019/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2019/TestIntegrityLevel.js b/node_modules/es-abstract/2019/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2019/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2019/TimeClip.js b/node_modules/es-abstract/2019/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2019/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2019/TimeFromYear.js b/node_modules/es-abstract/2019/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2019/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2019/TimeString.js b/node_modules/es-abstract/2019/TimeString.js
new file mode 100644
index 0000000..051c472
--- /dev/null
+++ b/node_modules/es-abstract/2019/TimeString.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var HourFromTime = require('./HourFromTime');
+var MinFromTime = require('./MinFromTime');
+var SecFromTime = require('./SecFromTime');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-timestring
+
+module.exports = function TimeString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var hour = HourFromTime(tv);
+	var minute = MinFromTime(tv);
+	var second = SecFromTime(tv);
+	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
+};
diff --git a/node_modules/es-abstract/2019/TimeWithinDay.js b/node_modules/es-abstract/2019/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2019/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2019/ToBoolean.js b/node_modules/es-abstract/2019/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2019/ToDateString.js b/node_modules/es-abstract/2019/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2019/ToIndex.js b/node_modules/es-abstract/2019/ToIndex.js
new file mode 100644
index 0000000..7c9d746
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToIndex.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+
+var ToInteger = require('./ToInteger');
+var ToLength = require('./ToLength');
+var SameValueZero = require('./SameValueZero');
+
+// https://262.ecma-international.org/8.0/#sec-toindex
+
+module.exports = function ToIndex(value) {
+	if (typeof value === 'undefined') {
+		return 0;
+	}
+	var integerIndex = ToInteger(value);
+	if (integerIndex < 0) {
+		throw new $RangeError('index must be >= 0');
+	}
+	var index = ToLength(integerIndex);
+	if (!SameValueZero(integerIndex, index)) {
+		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
+	}
+	return index;
+};
diff --git a/node_modules/es-abstract/2019/ToInt16.js b/node_modules/es-abstract/2019/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2019/ToInt32.js b/node_modules/es-abstract/2019/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2019/ToInt8.js b/node_modules/es-abstract/2019/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2019/ToInteger.js b/node_modules/es-abstract/2019/ToInteger.js
new file mode 100644
index 0000000..2975818
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToInteger.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	return ES5ToInteger(number);
+};
diff --git a/node_modules/es-abstract/2019/ToLength.js b/node_modules/es-abstract/2019/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2019/ToNumber.js b/node_modules/es-abstract/2019/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2019/ToObject.js b/node_modules/es-abstract/2019/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2019/ToPrimitive.js b/node_modules/es-abstract/2019/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2019/ToPropertyDescriptor.js b/node_modules/es-abstract/2019/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2019/ToPropertyKey.js b/node_modules/es-abstract/2019/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2019/ToString.js b/node_modules/es-abstract/2019/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2019/ToUint16.js b/node_modules/es-abstract/2019/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2019/ToUint32.js b/node_modules/es-abstract/2019/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2019/ToUint8.js b/node_modules/es-abstract/2019/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2019/ToUint8Clamp.js b/node_modules/es-abstract/2019/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2019/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2019/TrimString.js b/node_modules/es-abstract/2019/TrimString.js
new file mode 100644
index 0000000..113dcf8
--- /dev/null
+++ b/node_modules/es-abstract/2019/TrimString.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var trimStart = require('string.prototype.trimstart');
+var trimEnd = require('string.prototype.trimend');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/10.0/#sec-trimstring
+
+module.exports = function TrimString(string, where) {
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var T;
+	if (where === 'start') {
+		T = trimStart(S);
+	} else if (where === 'end') {
+		T = trimEnd(S);
+	} else if (where === 'start+end') {
+		T = trimStart(trimEnd(S));
+	} else {
+		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
+	}
+	return T;
+};
diff --git a/node_modules/es-abstract/2019/Type.js b/node_modules/es-abstract/2019/Type.js
new file mode 100644
index 0000000..0bd1165
--- /dev/null
+++ b/node_modules/es-abstract/2019/Type.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2019/UTF16Decode.js b/node_modules/es-abstract/2019/UTF16Decode.js
new file mode 100644
index 0000000..86927b4
--- /dev/null
+++ b/node_modules/es-abstract/2019/UTF16Decode.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+// https://262.ecma-international.org/7.0/#sec-utf16decode
+
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair
+
+module.exports = function UTF16Decode(lead, trail) {
+	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
+		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
+	}
+	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+	return $fromCharCode(lead) + $fromCharCode(trail);
+};
diff --git a/node_modules/es-abstract/2019/UTF16Encoding.js b/node_modules/es-abstract/2019/UTF16Encoding.js
new file mode 100644
index 0000000..f381595
--- /dev/null
+++ b/node_modules/es-abstract/2019/UTF16Encoding.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var isCodePoint = require('../helpers/isCodePoint');
+
+// https://262.ecma-international.org/7.0/#sec-utf16encoding
+
+module.exports = function UTF16Encoding(cp) {
+	if (!isCodePoint(cp)) {
+		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
+	}
+	if (cp <= 65535) {
+		return $fromCharCode(cp);
+	}
+	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
+	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
+	return $fromCharCode(cu1) + $fromCharCode(cu2);
+};
diff --git a/node_modules/es-abstract/2019/UnicodeEscape.js b/node_modules/es-abstract/2019/UnicodeEscape.js
new file mode 100644
index 0000000..db7163f
--- /dev/null
+++ b/node_modules/es-abstract/2019/UnicodeEscape.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+var $strSlice = callBound('String.prototype.slice');
+
+// https://262.ecma-international.org/9.0/#sec-unicodeescape
+
+module.exports = function UnicodeEscape(C) {
+	if (typeof C !== 'string' || C.length !== 1) {
+		throw new $TypeError('Assertion failed: `C` must be a single code unit');
+	}
+	var n = $charCodeAt(C, 0);
+	if (n > 0xFFFF) {
+		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
+	}
+
+	return '\\u' + $strSlice('0000' + $toLowerCase($numberToString(n, 16)), -4);
+};
diff --git a/node_modules/es-abstract/2019/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2019/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2019/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2019/WeekDay.js b/node_modules/es-abstract/2019/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2019/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2019/YearFromTime.js b/node_modules/es-abstract/2019/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2019/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2019/abs.js b/node_modules/es-abstract/2019/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2019/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2019/floor.js b/node_modules/es-abstract/2019/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2019/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2019/modulo.js b/node_modules/es-abstract/2019/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2019/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2019/msFromTime.js b/node_modules/es-abstract/2019/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2019/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2019/thisBooleanValue.js b/node_modules/es-abstract/2019/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2019/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2019/thisNumberValue.js b/node_modules/es-abstract/2019/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2019/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2019/thisStringValue.js b/node_modules/es-abstract/2019/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2019/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2019/thisSymbolValue.js b/node_modules/es-abstract/2019/thisSymbolValue.js
new file mode 100644
index 0000000..91a5525
--- /dev/null
+++ b/node_modules/es-abstract/2019/thisSymbolValue.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-thissymbolvalue
+
+module.exports = function thisSymbolValue(value) {
+	if (!$SymbolValueOf) {
+		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
+	}
+	if (Type(value) === 'Symbol') {
+		return value;
+	}
+	return $SymbolValueOf(value);
+};
diff --git a/node_modules/es-abstract/2019/thisTimeValue.js b/node_modules/es-abstract/2019/thisTimeValue.js
new file mode 100644
index 0000000..a9a47ac
--- /dev/null
+++ b/node_modules/es-abstract/2019/thisTimeValue.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../2018/thisTimeValue');
diff --git a/node_modules/es-abstract/2020/AbstractEqualityComparison.js b/node_modules/es-abstract/2020/AbstractEqualityComparison.js
new file mode 100644
index 0000000..c776194
--- /dev/null
+++ b/node_modules/es-abstract/2020/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2020/AbstractRelationalComparison.js b/node_modules/es-abstract/2020/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/2020/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/2020/AddEntriesFromIterable.js b/node_modules/es-abstract/2020/AddEntriesFromIterable.js
new file mode 100644
index 0000000..a0a5e71
--- /dev/null
+++ b/node_modules/es-abstract/2020/AddEntriesFromIterable.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var inspect = require('object-inspect');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var GetIterator = require('./GetIterator');
+var IsCallable = require('./IsCallable');
+var IteratorClose = require('./IteratorClose');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable
+
+module.exports = function AddEntriesFromIterable(target, iterable, adder) {
+	if (!IsCallable(adder)) {
+		throw new $TypeError('Assertion failed: `adder` is not callable');
+	}
+	if (iterable == null) {
+		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
+	}
+	var iteratorRecord = GetIterator(iterable);
+	while (true) { // eslint-disable-line no-constant-condition
+		var next = IteratorStep(iteratorRecord);
+		if (!next) {
+			return target;
+		}
+		var nextItem = IteratorValue(next);
+		if (Type(nextItem) !== 'Object') {
+			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
+			return IteratorClose(
+				iteratorRecord,
+				function () { throw error; } // eslint-disable-line no-loop-func
+			);
+		}
+		try {
+			var k = Get(nextItem, '0');
+			var v = Get(nextItem, '1');
+			Call(adder, target, [k, v]);
+		} catch (e) {
+			return IteratorClose(
+				iteratorRecord,
+				function () { throw e; }
+			);
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2020/AdvanceStringIndex.js b/node_modules/es-abstract/2020/AdvanceStringIndex.js
new file mode 100644
index 0000000..0e62c4a
--- /dev/null
+++ b/node_modules/es-abstract/2020/AdvanceStringIndex.js
@@ -0,0 +1,34 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var CodePointAt = require('./CodePointAt');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://262.ecma-international.org/6.0/#sec-advancestringindex
+
+module.exports = function AdvanceStringIndex(S, index, unicode) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
+	}
+	if (Type(unicode) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
+	}
+	if (!unicode) {
+		return index + 1;
+	}
+	var length = S.length;
+	if ((index + 1) >= length) {
+		return index + 1;
+	}
+	var cp = CodePointAt(S, index);
+	return index + cp['[[CodeUnitCount]]'];
+};
diff --git a/node_modules/es-abstract/2020/ArrayCreate.js b/node_modules/es-abstract/2020/ArrayCreate.js
new file mode 100644
index 0000000..4d20e2e
--- /dev/null
+++ b/node_modules/es-abstract/2020/ArrayCreate.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
+var $RangeError = GetIntrinsic('%RangeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+
+var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;
+
+var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayPrototype
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
+
+module.exports = function ArrayCreate(length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
+	}
+	if (length > MAX_ARRAY_LENGTH) {
+		throw new $RangeError('length is greater than (2**32 - 1)');
+	}
+	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
+	var A = []; // steps 5 - 7, and 9
+	if (proto !== $ArrayPrototype) { // step 8
+		if (!$setProto) {
+			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+		$setProto(A, proto);
+	}
+	if (length !== 0) { // bypasses the need for step 2
+		A.length = length;
+	}
+	/* step 10, the above as a shortcut for the below
+    OrdinaryDefineOwnProperty(A, 'length', {
+        '[[Configurable]]': false,
+        '[[Enumerable]]': false,
+        '[[Value]]': length,
+        '[[Writable]]': true
+    });
+    */
+	return A;
+};
diff --git a/node_modules/es-abstract/2020/ArraySetLength.js b/node_modules/es-abstract/2020/ArraySetLength.js
new file mode 100644
index 0000000..08db9c2
--- /dev/null
+++ b/node_modules/es-abstract/2020/ArraySetLength.js
@@ -0,0 +1,85 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var assign = require('object.assign');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsArray = require('./IsArray');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength
+
+// eslint-disable-next-line max-statements, max-lines-per-function
+module.exports = function ArraySetLength(A, Desc) {
+	if (!IsArray(A)) {
+		throw new $TypeError('Assertion failed: A must be an Array');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!('[[Value]]' in Desc)) {
+		return OrdinaryDefineOwnProperty(A, 'length', Desc);
+	}
+	var newLenDesc = assign({}, Desc);
+	var newLen = ToUint32(Desc['[[Value]]']);
+	var numberLen = ToNumber(Desc['[[Value]]']);
+	if (newLen !== numberLen) {
+		throw new $RangeError('Invalid array length');
+	}
+	newLenDesc['[[Value]]'] = newLen;
+	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
+	if (!IsDataDescriptor(oldLenDesc)) {
+		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
+	}
+	var oldLen = oldLenDesc['[[Value]]'];
+	if (newLen >= oldLen) {
+		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	}
+	if (!oldLenDesc['[[Writable]]']) {
+		return false;
+	}
+	var newWritable;
+	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
+		newWritable = true;
+	} else {
+		newWritable = false;
+		newLenDesc['[[Writable]]'] = true;
+	}
+	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+	if (!succeeded) {
+		return false;
+	}
+	while (newLen < oldLen) {
+		oldLen -= 1;
+		// eslint-disable-next-line no-param-reassign
+		var deleteSucceeded = delete A[ToString(oldLen)];
+		if (!deleteSucceeded) {
+			newLenDesc['[[Value]]'] = oldLen + 1;
+			if (!newWritable) {
+				newLenDesc['[[Writable]]'] = false;
+				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
+				return false;
+			}
+		}
+	}
+	if (!newWritable) {
+		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/ArraySpeciesCreate.js b/node_modules/es-abstract/2020/ArraySpeciesCreate.js
new file mode 100644
index 0000000..26d63b5
--- /dev/null
+++ b/node_modules/es-abstract/2020/ArraySpeciesCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsConstructor = require('./IsConstructor');
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+
+module.exports = function ArraySpeciesCreate(originalArray, length) {
+	if (!IsInteger(length) || length < 0) {
+		throw new $TypeError('Assertion failed: length must be an integer >= 0');
+	}
+	var len = length === 0 ? 0 : length;
+	var C;
+	var isArray = IsArray(originalArray);
+	if (isArray) {
+		C = Get(originalArray, 'constructor');
+		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+		// if (IsConstructor(C)) {
+		// 	if C is another realm's Array, C = undefined
+		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+		// }
+		if ($species && Type(C) === 'Object') {
+			C = Get(C, $species);
+			if (C === null) {
+				C = void 0;
+			}
+		}
+	}
+	if (typeof C === 'undefined') {
+		return $Array(len);
+	}
+	if (!IsConstructor(C)) {
+		throw new $TypeError('C must be a constructor');
+	}
+	return new C(len); // Construct(C, len);
+};
+
diff --git a/node_modules/es-abstract/2020/BigInt/add.js b/node_modules/es-abstract/2020/BigInt/add.js
new file mode 100644
index 0000000..22b5db4
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/add.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add
+
+module.exports = function BigIntAdd(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	// shortcut for the actual spec mechanics
+	return x + y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/bitwiseAND.js b/node_modules/es-abstract/2020/BigInt/bitwiseAND.js
new file mode 100644
index 0000000..83cd2c3
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/bitwiseAND.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var BigIntBitwiseOp = require('../BigIntBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND
+
+module.exports = function BigIntBitwiseAND(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+	return BigIntBitwiseOp('&', x, y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/bitwiseNOT.js b/node_modules/es-abstract/2020/BigInt/bitwiseNOT.js
new file mode 100644
index 0000000..9a444df
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/bitwiseNOT.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT
+
+module.exports = function BigIntBitwiseNOT(x) {
+	if (Type(x) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
+	}
+	return -x - $BigInt(1);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/bitwiseOR.js b/node_modules/es-abstract/2020/BigInt/bitwiseOR.js
new file mode 100644
index 0000000..3c1b571
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/bitwiseOR.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var BigIntBitwiseOp = require('../BigIntBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR
+
+module.exports = function BigIntBitwiseOR(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+	return BigIntBitwiseOp('|', x, y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/bitwiseXOR.js b/node_modules/es-abstract/2020/BigInt/bitwiseXOR.js
new file mode 100644
index 0000000..45f8217
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/bitwiseXOR.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var BigIntBitwiseOp = require('../BigIntBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR
+
+module.exports = function BigIntBitwiseXOR(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+	return BigIntBitwiseOp('^', x, y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/divide.js b/node_modules/es-abstract/2020/BigInt/divide.js
new file mode 100644
index 0000000..5706e7d
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/divide.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide
+
+module.exports = function BigIntDivide(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+	if (y === $BigInt(0)) {
+		throw new $RangeError('Division by zero');
+	}
+	// shortcut for the actual spec mechanics
+	return x / y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/equal.js b/node_modules/es-abstract/2020/BigInt/equal.js
new file mode 100644
index 0000000..a28826d
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/equal.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal
+
+module.exports = function BigIntEqual(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+	// shortcut for the actual spec mechanics
+	return x === y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/exponentiate.js b/node_modules/es-abstract/2020/BigInt/exponentiate.js
new file mode 100644
index 0000000..2365838
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/exponentiate.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate
+
+module.exports = function BigIntExponentiate(base, exponent) {
+	if (Type(base) !== 'BigInt' || Type(exponent) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be BigInts');
+	}
+	if (exponent < $BigInt(0)) {
+		throw new $RangeError('Exponent must be positive');
+	}
+	if (/* base === $BigInt(0) && */ exponent === $BigInt(0)) {
+		return $BigInt(1);
+	}
+
+	var square = base;
+	var remaining = exponent;
+	while (remaining > $BigInt(0)) {
+		square += exponent;
+		--remaining; // eslint-disable-line no-plusplus
+	}
+	return square;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/index.js b/node_modules/es-abstract/2020/BigInt/index.js
new file mode 100644
index 0000000..63ec52d
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/index.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var add = require('./add');
+var bitwiseAND = require('./bitwiseAND');
+var bitwiseNOT = require('./bitwiseNOT');
+var bitwiseOR = require('./bitwiseOR');
+var bitwiseXOR = require('./bitwiseXOR');
+var divide = require('./divide');
+var equal = require('./equal');
+var exponentiate = require('./exponentiate');
+var leftShift = require('./leftShift');
+var lessThan = require('./lessThan');
+var multiply = require('./multiply');
+var remainder = require('./remainder');
+var sameValue = require('./sameValue');
+var sameValueZero = require('./sameValueZero');
+var signedRightShift = require('./signedRightShift');
+var subtract = require('./subtract');
+var toString = require('./toString');
+var unaryMinus = require('./unaryMinus');
+var unsignedRightShift = require('./unsignedRightShift');
+
+module.exports = {
+	add: add,
+	bitwiseAND: bitwiseAND,
+	bitwiseNOT: bitwiseNOT,
+	bitwiseOR: bitwiseOR,
+	bitwiseXOR: bitwiseXOR,
+	divide: divide,
+	equal: equal,
+	exponentiate: exponentiate,
+	leftShift: leftShift,
+	lessThan: lessThan,
+	multiply: multiply,
+	remainder: remainder,
+	sameValue: sameValue,
+	sameValueZero: sameValueZero,
+	signedRightShift: signedRightShift,
+	subtract: subtract,
+	toString: toString,
+	unaryMinus: unaryMinus,
+	unsignedRightShift: unsignedRightShift
+};
diff --git a/node_modules/es-abstract/2020/BigInt/leftShift.js b/node_modules/es-abstract/2020/BigInt/leftShift.js
new file mode 100644
index 0000000..d2a5702
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/leftShift.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift
+
+module.exports = function BigIntLeftShift(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	// shortcut for the actual spec mechanics
+	return x << y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/lessThan.js b/node_modules/es-abstract/2020/BigInt/lessThan.js
new file mode 100644
index 0000000..0b3cd6b
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/lessThan.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan
+
+module.exports = function BigIntLessThan(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	// shortcut for the actual spec mechanics
+	return x < y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/multiply.js b/node_modules/es-abstract/2020/BigInt/multiply.js
new file mode 100644
index 0000000..6e5d56c
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/multiply.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply
+
+module.exports = function BigIntMultiply(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	// shortcut for the actual spec mechanics
+	return x * y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/remainder.js b/node_modules/es-abstract/2020/BigInt/remainder.js
new file mode 100644
index 0000000..d2dc678
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/remainder.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+var zero = $BigInt && $BigInt(0);
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder
+
+module.exports = function BigIntRemainder(n, d) {
+	if (Type(n) !== 'BigInt' || Type(d) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `n` and `d` arguments must be BigInts');
+	}
+
+	if (d === zero) {
+		throw new $RangeError('Division by zero');
+	}
+
+	if (n === zero) {
+		return zero;
+	}
+
+	// shortcut for the actual spec mechanics
+	return n % d;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/sameValue.js b/node_modules/es-abstract/2020/BigInt/sameValue.js
new file mode 100644
index 0000000..63ff063
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/sameValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+var BigIntEqual = require('./equal');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue
+
+module.exports = function BigIntSameValue(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	return BigIntEqual(x, y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/sameValueZero.js b/node_modules/es-abstract/2020/BigInt/sameValueZero.js
new file mode 100644
index 0000000..39f262c
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/sameValueZero.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+var BigIntEqual = require('./equal');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero
+
+module.exports = function BigIntSameValueZero(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	return BigIntEqual(x, y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/signedRightShift.js b/node_modules/es-abstract/2020/BigInt/signedRightShift.js
new file mode 100644
index 0000000..f63c642
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/signedRightShift.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+var BigIntLeftShift = require('./leftShift');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift
+
+module.exports = function BigIntSignedRightShift(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	return BigIntLeftShift(x, -y);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/subtract.js b/node_modules/es-abstract/2020/BigInt/subtract.js
new file mode 100644
index 0000000..0490784
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/subtract.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract
+
+module.exports = function BigIntSubtract(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	// shortcut for the actual spec mechanics
+	return x - y;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/toString.js b/node_modules/es-abstract/2020/BigInt/toString.js
new file mode 100644
index 0000000..858d955
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/toString.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring
+
+module.exports = function BigIntToString(x) {
+	if (Type(x) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` must be a BigInt');
+	}
+
+	return $String(x);
+};
diff --git a/node_modules/es-abstract/2020/BigInt/unaryMinus.js b/node_modules/es-abstract/2020/BigInt/unaryMinus.js
new file mode 100644
index 0000000..ee0f7ef
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/unaryMinus.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+var zero = $BigInt && $BigInt(0);
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus
+
+module.exports = function BigIntUnaryMinus(x) {
+	if (Type(x) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
+	}
+
+	if (x === zero) {
+		return zero;
+	}
+
+	return -x;
+};
diff --git a/node_modules/es-abstract/2020/BigInt/unsignedRightShift.js b/node_modules/es-abstract/2020/BigInt/unsignedRightShift.js
new file mode 100644
index 0000000..7ad94f7
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigInt/unsignedRightShift.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift
+
+module.exports = function BigIntUnsignedRightShift(x, y) {
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
+	}
+
+	throw new $TypeError('BigInts have no unsigned right shift, use >> instead');
+};
diff --git a/node_modules/es-abstract/2020/BigIntBitwiseOp.js b/node_modules/es-abstract/2020/BigIntBitwiseOp.js
new file mode 100644
index 0000000..1af4cad
--- /dev/null
+++ b/node_modules/es-abstract/2020/BigIntBitwiseOp.js
@@ -0,0 +1,66 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+// var $BigInt = GetIntrinsic('%BigInt%', true);
+// var $pow = GetIntrinsic('%Math.pow%');
+
+// var BinaryAnd = require('./BinaryAnd');
+// var BinaryOr = require('./BinaryOr');
+// var BinaryXor = require('./BinaryXor');
+var Type = require('./Type');
+// var modulo = require('./modulo');
+
+// var zero = $BigInt && $BigInt(0);
+// var negOne = $BigInt && $BigInt(-1);
+// var two = $BigInt && $BigInt(2);
+
+// https://262.ecma-international.org/11.0/#sec-bigintbitwiseop
+
+module.exports = function BigIntBitwiseOp(op, x, y) {
+	if (op !== '&' && op !== '|' && op !== '^') {
+		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
+	}
+	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
+		throw new $TypeError('`x` and `y` must be BigInts');
+	}
+
+	if (op === '&') {
+		return x & y;
+	}
+	if (op === '|') {
+		return x | y;
+	}
+	return x ^ y;
+	/*
+	var result = zero;
+	var shift = 0;
+	while (x !== zero && x !== negOne && y !== zero && y !== negOne) {
+		var xDigit = modulo(x, two);
+		var yDigit = modulo(y, two);
+		if (op === '&') {
+			result += $pow(2, shift) * BinaryAnd(xDigit, yDigit);
+		} else if (op === '|') {
+			result += $pow(2, shift) * BinaryOr(xDigit, yDigit);
+		} else if (op === '^') {
+			result += $pow(2, shift) * BinaryXor(xDigit, yDigit);
+		}
+		shift += 1;
+		x = (x - xDigit) / two;
+		y = (y - yDigit) / two;
+	}
+	var tmp;
+	if (op === '&') {
+		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
+	} else if (op === '|') {
+		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
+	} else {
+		tmp = BinaryXor(modulo(x, two), modulo(y, two));
+	}
+	if (tmp !== 0) {
+		result -= $pow(2, shift);
+	}
+    return result;
+    */
+};
diff --git a/node_modules/es-abstract/2020/BinaryAnd.js b/node_modules/es-abstract/2020/BinaryAnd.js
new file mode 100644
index 0000000..c617f38
--- /dev/null
+++ b/node_modules/es-abstract/2020/BinaryAnd.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://262.ecma-international.org/11.0/#sec-binaryand
+
+module.exports = function BinaryAnd(x, y) {
+	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
+		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
+	}
+	return x & y;
+};
diff --git a/node_modules/es-abstract/2020/BinaryOr.js b/node_modules/es-abstract/2020/BinaryOr.js
new file mode 100644
index 0000000..6de0955
--- /dev/null
+++ b/node_modules/es-abstract/2020/BinaryOr.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://262.ecma-international.org/11.0/#sec-binaryor
+
+module.exports = function BinaryOr(x, y) {
+	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
+		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
+	}
+	return x | y;
+};
diff --git a/node_modules/es-abstract/2020/BinaryXor.js b/node_modules/es-abstract/2020/BinaryXor.js
new file mode 100644
index 0000000..189d7d8
--- /dev/null
+++ b/node_modules/es-abstract/2020/BinaryXor.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://262.ecma-international.org/11.0/#sec-binaryxor
+
+module.exports = function BinaryXor(x, y) {
+	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
+		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
+	}
+	return x ^ y;
+};
diff --git a/node_modules/es-abstract/2020/Call.js b/node_modules/es-abstract/2020/Call.js
new file mode 100644
index 0000000..4b238c6
--- /dev/null
+++ b/node_modules/es-abstract/2020/Call.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsArray = require('./IsArray');
+
+var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-call
+
+module.exports = function Call(F, V) {
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	return $apply(F, V, argumentsList);
+};
diff --git a/node_modules/es-abstract/2020/CanonicalNumericIndexString.js b/node_modules/es-abstract/2020/CanonicalNumericIndexString.js
new file mode 100644
index 0000000..feb878c
--- /dev/null
+++ b/node_modules/es-abstract/2020/CanonicalNumericIndexString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+
+module.exports = function CanonicalNumericIndexString(argument) {
+	if (Type(argument) !== 'String') {
+		throw new $TypeError('Assertion failed: `argument` must be a String');
+	}
+	if (argument === '-0') { return -0; }
+	var n = ToNumber(argument);
+	if (SameValue(ToString(n), argument)) { return n; }
+	return void 0;
+};
diff --git a/node_modules/es-abstract/2020/CodePointAt.js b/node_modules/es-abstract/2020/CodePointAt.js
new file mode 100644
index 0000000..b887631
--- /dev/null
+++ b/node_modules/es-abstract/2020/CodePointAt.js
@@ -0,0 +1,58 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var callBound = require('call-bind/callBound');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var Type = require('./Type');
+var UTF16DecodeSurrogatePair = require('./UTF16DecodeSurrogatePair');
+
+var $charAt = callBound('String.prototype.charAt');
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+
+// https://262.ecma-international.org/11.0/#sec-codepointat
+
+module.exports = function CodePointAt(string, position) {
+	if (Type(string) !== 'String') {
+		throw new $TypeError('Assertion failed: `string` must be a String');
+	}
+	var size = string.length;
+	if (position < 0 || position >= size) {
+		throw new $TypeError('Assertion failed: `position` must be >= 0, and < the length of `string`');
+	}
+	var first = $charCodeAt(string, position);
+	var cp = $charAt(string, position);
+	var firstIsLeading = isLeadingSurrogate(first);
+	var firstIsTrailing = isTrailingSurrogate(first);
+	if (!firstIsLeading && !firstIsTrailing) {
+		return {
+			'[[CodePoint]]': cp,
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		};
+	}
+	if (firstIsTrailing || (position + 1 === size)) {
+		return {
+			'[[CodePoint]]': cp,
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': true
+		};
+	}
+	var second = $charCodeAt(string, position + 1);
+	if (!isTrailingSurrogate(second)) {
+		return {
+			'[[CodePoint]]': cp,
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': true
+		};
+	}
+
+	return {
+		'[[CodePoint]]': UTF16DecodeSurrogatePair(first, second),
+		'[[CodeUnitCount]]': 2,
+		'[[IsUnpairedSurrogate]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2020/CompletePropertyDescriptor.js b/node_modules/es-abstract/2020/CompletePropertyDescriptor.js
new file mode 100644
index 0000000..548bf41
--- /dev/null
+++ b/node_modules/es-abstract/2020/CompletePropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+
+module.exports = function CompletePropertyDescriptor(Desc) {
+	/* eslint no-param-reassign: 0 */
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+		if (!has(Desc, '[[Value]]')) {
+			Desc['[[Value]]'] = void 0;
+		}
+		if (!has(Desc, '[[Writable]]')) {
+			Desc['[[Writable]]'] = false;
+		}
+	} else {
+		if (!has(Desc, '[[Get]]')) {
+			Desc['[[Get]]'] = void 0;
+		}
+		if (!has(Desc, '[[Set]]')) {
+			Desc['[[Set]]'] = void 0;
+		}
+	}
+	if (!has(Desc, '[[Enumerable]]')) {
+		Desc['[[Enumerable]]'] = false;
+	}
+	if (!has(Desc, '[[Configurable]]')) {
+		Desc['[[Configurable]]'] = false;
+	}
+	return Desc;
+};
diff --git a/node_modules/es-abstract/2020/CopyDataProperties.js b/node_modules/es-abstract/2020/CopyDataProperties.js
new file mode 100644
index 0000000..7bd7dda
--- /dev/null
+++ b/node_modules/es-abstract/2020/CopyDataProperties.js
@@ -0,0 +1,64 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+var every = require('../helpers/every');
+var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToNumber = require('./ToNumber');
+var ToObject = require('./ToObject');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-copydataproperties
+
+module.exports = function CopyDataProperties(target, source, excludedItems) {
+	if (Type(target) !== 'Object') {
+		throw new $TypeError('Assertion failed: "target" must be an Object');
+	}
+
+	if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) {
+		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
+	}
+
+	if (typeof source === 'undefined' || source === null) {
+		return target;
+	}
+
+	var from = ToObject(source);
+
+	var sourceKeys = OwnPropertyKeys(from);
+	forEach(sourceKeys, function (nextKey) {
+		var excluded = false;
+
+		forEach(excludedItems, function (e) {
+			if (SameValue(e, nextKey) === true) {
+				excluded = true;
+			}
+		});
+
+		var enumerable = $isEnumerable(from, nextKey) || (
+		// this is to handle string keys being non-enumerable in older engines
+			typeof source === 'string'
+            && nextKey >= 0
+            && IsInteger(ToNumber(nextKey))
+		);
+		if (excluded === false && enumerable) {
+			var propValue = Get(from, nextKey);
+			CreateDataPropertyOrThrow(target, nextKey, propValue);
+		}
+	});
+
+	return target;
+};
diff --git a/node_modules/es-abstract/2020/CreateDataProperty.js b/node_modules/es-abstract/2020/CreateDataProperty.js
new file mode 100644
index 0000000..ff5ca30
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateDataProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty
+
+module.exports = function CreateDataProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var oldDesc = OrdinaryGetOwnProperty(O, P);
+	var extensible = !oldDesc || IsExtensible(O);
+	var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);
+	if (immutable || !extensible) {
+		return false;
+	}
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		{
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Value]]': V,
+			'[[Writable]]': true
+		}
+	);
+};
diff --git a/node_modules/es-abstract/2020/CreateDataPropertyOrThrow.js b/node_modules/es-abstract/2020/CreateDataPropertyOrThrow.js
new file mode 100644
index 0000000..2f7c410
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateDataPropertyOrThrow.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var CreateDataProperty = require('./CreateDataProperty');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+
+module.exports = function CreateDataPropertyOrThrow(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	var success = CreateDataProperty(O, P, V);
+	if (!success) {
+		throw new $TypeError('unable to create data property');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2020/CreateHTML.js b/node_modules/es-abstract/2020/CreateHTML.js
new file mode 100644
index 0000000..ccded1e
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateHTML.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $replace = callBound('String.prototype.replace');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createhtml
+
+module.exports = function CreateHTML(string, tag, attribute, value) {
+	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
+		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
+	}
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var p1 = '<' + tag;
+	if (attribute !== '') {
+		var V = ToString(value);
+		var escapedV = $replace(V, /\x22/g, '&quot;');
+		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
+	}
+	return p1 + '>' + S + '</' + tag + '>';
+};
diff --git a/node_modules/es-abstract/2020/CreateIterResultObject.js b/node_modules/es-abstract/2020/CreateIterResultObject.js
new file mode 100644
index 0000000..eea77a5
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateIterResultObject.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+
+module.exports = function CreateIterResultObject(value, done) {
+	if (Type(done) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+	}
+	return {
+		value: value,
+		done: done
+	};
+};
diff --git a/node_modules/es-abstract/2020/CreateListFromArrayLike.js b/node_modules/es-abstract/2020/CreateListFromArrayLike.js
new file mode 100644
index 0000000..3e9f5f4
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateListFromArrayLike.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
+var $push = callBound('Array.prototype.push');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var LengthOfArrayLike = require('./LengthOfArrayLike');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-createlistfromarraylike
+
+module.exports = function CreateListFromArrayLike(obj) {
+	var elementTypes = arguments.length > 1
+		? arguments[1]
+		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
+
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	if (!IsArray(elementTypes)) {
+		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
+	}
+	var len = LengthOfArrayLike(obj);
+	var list = [];
+	var index = 0;
+	while (index < len) {
+		var indexName = ToString(index);
+		var next = Get(obj, indexName);
+		var nextType = Type(next);
+		if ($indexOf(elementTypes, nextType) < 0) {
+			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
+		}
+		$push(list, next);
+		index += 1;
+	}
+	return list;
+};
diff --git a/node_modules/es-abstract/2020/CreateMethodProperty.js b/node_modules/es-abstract/2020/CreateMethodProperty.js
new file mode 100644
index 0000000..53274a5
--- /dev/null
+++ b/node_modules/es-abstract/2020/CreateMethodProperty.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
+
+module.exports = function CreateMethodProperty(O, P, V) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var newDesc = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': V,
+		'[[Writable]]': true
+	};
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		newDesc
+	);
+};
diff --git a/node_modules/es-abstract/2020/DateFromTime.js b/node_modules/es-abstract/2020/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/2020/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/2020/DateString.js b/node_modules/es-abstract/2020/DateString.js
new file mode 100644
index 0000000..939c14c
--- /dev/null
+++ b/node_modules/es-abstract/2020/DateString.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var Type = require('./Type');
+var WeekDay = require('./WeekDay');
+var MonthFromTime = require('./MonthFromTime');
+var YearFromTime = require('./YearFromTime');
+var DateFromTime = require('./DateFromTime');
+
+// https://262.ecma-international.org/9.0/#sec-datestring
+
+module.exports = function DateString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var weekday = weekdays[WeekDay(tv)];
+	var month = months[MonthFromTime(tv)];
+	var day = padTimeComponent(DateFromTime(tv));
+	var year = padTimeComponent(YearFromTime(tv), 4);
+	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
+};
diff --git a/node_modules/es-abstract/2020/Day.js b/node_modules/es-abstract/2020/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/2020/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/2020/DayFromYear.js b/node_modules/es-abstract/2020/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/2020/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/2020/DayWithinYear.js b/node_modules/es-abstract/2020/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/2020/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/2020/DaysInYear.js b/node_modules/es-abstract/2020/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/2020/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/2020/DefinePropertyOrThrow.js b/node_modules/es-abstract/2020/DefinePropertyOrThrow.js
new file mode 100644
index 0000000..26f2714
--- /dev/null
+++ b/node_modules/es-abstract/2020/DefinePropertyOrThrow.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
+
+module.exports = function DefinePropertyOrThrow(O, P, desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	var Desc = isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, desc) ? desc : ToPropertyDescriptor(desc);
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
+	}
+
+	return DefineOwnProperty(
+		IsDataDescriptor,
+		SameValue,
+		FromPropertyDescriptor,
+		O,
+		P,
+		Desc
+	);
+};
diff --git a/node_modules/es-abstract/2020/DeletePropertyOrThrow.js b/node_modules/es-abstract/2020/DeletePropertyOrThrow.js
new file mode 100644
index 0000000..30d5e57
--- /dev/null
+++ b/node_modules/es-abstract/2020/DeletePropertyOrThrow.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
+
+module.exports = function DeletePropertyOrThrow(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// eslint-disable-next-line no-param-reassign
+	var success = delete O[P];
+	if (!success) {
+		throw new $TypeError('Attempt to delete property failed.');
+	}
+	return success;
+};
diff --git a/node_modules/es-abstract/2020/EnumerableOwnPropertyNames.js b/node_modules/es-abstract/2020/EnumerableOwnPropertyNames.js
new file mode 100644
index 0000000..44171b9
--- /dev/null
+++ b/node_modules/es-abstract/2020/EnumerableOwnPropertyNames.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var objectKeys = require('object-keys');
+
+var callBound = require('call-bind/callBound');
+
+var callBind = require('call-bind');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
+
+var forEach = require('../helpers/forEach');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/8.0/#sec-enumerableownproperties
+
+module.exports = function EnumerableOwnProperties(O, kind) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+
+	var keys = objectKeys(O);
+	if (kind === 'key') {
+		return keys;
+	}
+	if (kind === 'value' || kind === 'key+value') {
+		var results = [];
+		forEach(keys, function (key) {
+			if ($isEnumerable(O, key)) {
+				$pushApply(results, [
+					kind === 'value' ? O[key] : [key, O[key]]
+				]);
+			}
+		});
+		return results;
+	}
+	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
+};
diff --git a/node_modules/es-abstract/2020/FlattenIntoArray.js b/node_modules/es-abstract/2020/FlattenIntoArray.js
new file mode 100644
index 0000000..6429ee7
--- /dev/null
+++ b/node_modules/es-abstract/2020/FlattenIntoArray.js
@@ -0,0 +1,58 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var Call = require('./Call');
+var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
+var Get = require('./Get');
+var HasProperty = require('./HasProperty');
+var IsArray = require('./IsArray');
+var LengthOfArrayLike = require('./LengthOfArrayLike');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/11.0/#sec-flattenintoarray
+
+// eslint-disable-next-line max-params
+module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
+	var mapperFunction;
+	if (arguments.length > 5) {
+		mapperFunction = arguments[5];
+	}
+
+	var targetIndex = start;
+	var sourceIndex = 0;
+	while (sourceIndex < sourceLen) {
+		var P = ToString(sourceIndex);
+		var exists = HasProperty(source, P);
+		if (exists === true) {
+			var element = Get(source, P);
+			if (typeof mapperFunction !== 'undefined') {
+				if (arguments.length <= 6) {
+					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
+				}
+				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
+			}
+			var shouldFlatten = false;
+			if (depth > 0) {
+				shouldFlatten = IsArray(element);
+			}
+			if (shouldFlatten) {
+				var elementLen = LengthOfArrayLike(element);
+				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
+			} else {
+				if (targetIndex >= MAX_SAFE_INTEGER) {
+					throw new $TypeError('index too large');
+				}
+				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
+				targetIndex += 1;
+			}
+		}
+		sourceIndex += 1;
+	}
+
+	return targetIndex;
+};
diff --git a/node_modules/es-abstract/2020/FromPropertyDescriptor.js b/node_modules/es-abstract/2020/FromPropertyDescriptor.js
new file mode 100644
index 0000000..9a69a26
--- /dev/null
+++ b/node_modules/es-abstract/2020/FromPropertyDescriptor.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	var obj = {};
+	if ('[[Value]]' in Desc) {
+		obj.value = Desc['[[Value]]'];
+	}
+	if ('[[Writable]]' in Desc) {
+		obj.writable = Desc['[[Writable]]'];
+	}
+	if ('[[Get]]' in Desc) {
+		obj.get = Desc['[[Get]]'];
+	}
+	if ('[[Set]]' in Desc) {
+		obj.set = Desc['[[Set]]'];
+	}
+	if ('[[Enumerable]]' in Desc) {
+		obj.enumerable = Desc['[[Enumerable]]'];
+	}
+	if ('[[Configurable]]' in Desc) {
+		obj.configurable = Desc['[[Configurable]]'];
+	}
+	return obj;
+};
diff --git a/node_modules/es-abstract/2020/Get.js b/node_modules/es-abstract/2020/Get.js
new file mode 100644
index 0000000..681055a
--- /dev/null
+++ b/node_modules/es-abstract/2020/Get.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var inspect = require('object-inspect');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+/**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+
+module.exports = function Get(O, P) {
+	// 7.3.1.1
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	// 7.3.1.2
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
+	}
+	// 7.3.1.3
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2020/GetIterator.js b/node_modules/es-abstract/2020/GetIterator.js
new file mode 100644
index 0000000..0e74c17
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetIterator.js
@@ -0,0 +1,65 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);
+
+var inspect = require('object-inspect');
+var hasSymbols = require('has-symbols')();
+
+var getIteratorMethod = require('../helpers/getIteratorMethod');
+var AdvanceStringIndex = require('./AdvanceStringIndex');
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-getiterator
+module.exports = function GetIterator(obj, hint, method) {
+	var actualHint = hint;
+	if (arguments.length < 2) {
+		actualHint = 'sync';
+	}
+	if (actualHint !== 'sync' && actualHint !== 'async') {
+		throw new $TypeError("Assertion failed: `hint` must be one of 'sync' or 'async', got " + inspect(hint));
+	}
+
+	var actualMethod = method;
+	if (arguments.length < 3) {
+		if (actualHint === 'async') {
+			if (hasSymbols && $asyncIterator) {
+				actualMethod = GetMethod(obj, $asyncIterator);
+			}
+			if (actualMethod === undefined) {
+				throw new $TypeError("async from sync iterators aren't currently supported");
+			}
+		} else {
+			actualMethod = getIteratorMethod(
+				{
+					AdvanceStringIndex: AdvanceStringIndex,
+					GetMethod: GetMethod,
+					IsArray: IsArray,
+					Type: Type
+				},
+				obj
+			);
+		}
+	}
+	var iterator = Call(actualMethod, obj);
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('iterator must return an object');
+	}
+
+	return iterator;
+
+	// TODO: This should return an IteratorRecord
+	/*
+	var nextMethod = GetV(iterator, 'next');
+	return {
+		'[[Iterator]]': iterator,
+		'[[NextMethod]]': nextMethod,
+		'[[Done]]': false
+	};
+	*/
+};
diff --git a/node_modules/es-abstract/2020/GetMethod.js b/node_modules/es-abstract/2020/GetMethod.js
new file mode 100644
index 0000000..775d3fb
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetMethod.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetV = require('./GetV');
+var IsCallable = require('./IsCallable');
+var IsPropertyKey = require('./IsPropertyKey');
+
+/**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+
+module.exports = function GetMethod(O, P) {
+	// 7.3.9.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.9.2
+	var func = GetV(O, P);
+
+	// 7.3.9.4
+	if (func == null) {
+		return void 0;
+	}
+
+	// 7.3.9.5
+	if (!IsCallable(func)) {
+		throw new $TypeError(P + 'is not a function');
+	}
+
+	// 7.3.9.6
+	return func;
+};
diff --git a/node_modules/es-abstract/2020/GetOwnPropertyKeys.js b/node_modules/es-abstract/2020/GetOwnPropertyKeys.js
new file mode 100644
index 0000000..b8f4167
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetOwnPropertyKeys.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var hasSymbols = require('has-symbols')();
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
+var keys = require('object-keys');
+
+var esType = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys
+
+module.exports = function GetOwnPropertyKeys(O, Type) {
+	if (esType(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (Type === 'Symbol') {
+		return $gOPS ? $gOPS(O) : [];
+	}
+	if (Type === 'String') {
+		if (!$gOPN) {
+			return keys(O);
+		}
+		return $gOPN(O);
+	}
+	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
+};
diff --git a/node_modules/es-abstract/2020/GetPrototypeFromConstructor.js b/node_modules/es-abstract/2020/GetPrototypeFromConstructor.js
new file mode 100644
index 0000000..5f369ca
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetPrototypeFromConstructor.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Function = GetIntrinsic('%Function%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor
+
+module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
+	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	if (!IsConstructor(constructor)) {
+		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
+	}
+	var proto = Get(constructor, 'prototype');
+	if (Type(proto) !== 'Object') {
+		if (!(constructor instanceof $Function)) {
+			// ignore other realms, for now
+			throw new $TypeError('cross-realm constructors not currently supported');
+		}
+		proto = intrinsic;
+	}
+	return proto;
+};
diff --git a/node_modules/es-abstract/2020/GetSubstitution.js b/node_modules/es-abstract/2020/GetSubstitution.js
new file mode 100644
index 0000000..a5a7a1b
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetSubstitution.js
@@ -0,0 +1,128 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var every = require('../helpers/every');
+
+var $charAt = callBound('String.prototype.charAt');
+var $strSlice = callBound('String.prototype.slice');
+var $indexOf = callBound('String.prototype.indexOf');
+var $parseInt = parseInt;
+
+var isDigit = regexTester(/^[0-9]$/);
+
+var inspect = require('object-inspect');
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var IsInteger = require('./IsInteger');
+var ToObject = require('./ToObject');
+var ToString = require('./ToString');
+var Type = require('./Type');
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+var isStringOrHole = function (capture, index, arr) {
+	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
+};
+
+// http://262.ecma-international.org/9.0/#sec-getsubstitution
+
+// eslint-disable-next-line max-statements, max-params, max-lines-per-function
+module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
+	if (Type(matched) !== 'String') {
+		throw new $TypeError('Assertion failed: `matched` must be a String');
+	}
+	var matchLength = matched.length;
+
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `str` must be a String');
+	}
+	var stringLength = str.length;
+
+	if (!IsInteger(position) || position < 0 || position > stringLength) {
+		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
+	}
+
+	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
+		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
+	}
+
+	if (Type(replacement) !== 'String') {
+		throw new $TypeError('Assertion failed: `replacement` must be a String');
+	}
+
+	var tailPos = position + matchLength;
+	var m = captures.length;
+	if (Type(namedCaptures) !== 'Undefined') {
+		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
+	}
+
+	var result = '';
+	for (var i = 0; i < replacement.length; i += 1) {
+		// if this is a $, and it's not the end of the replacement
+		var current = $charAt(replacement, i);
+		var isLast = (i + 1) >= replacement.length;
+		var nextIsLast = (i + 2) >= replacement.length;
+		if (current === '$' && !isLast) {
+			var next = $charAt(replacement, i + 1);
+			if (next === '$') {
+				result += '$';
+				i += 1;
+			} else if (next === '&') {
+				result += matched;
+				i += 1;
+			} else if (next === '`') {
+				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
+				i += 1;
+			} else if (next === "'") {
+				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
+				i += 1;
+			} else {
+				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
+				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
+					// $1 through $9, and not followed by a digit
+					var n = $parseInt(next, 10);
+					// if (n > m, impl-defined)
+					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
+					i += 1;
+				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
+					// $00 through $99
+					var nn = next + nextNext;
+					var nnI = $parseInt(nn, 10) - 1;
+					// if nn === '00' or nn > m, impl-defined
+					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
+					i += 2;
+				} else if (next === '<') {
+					// eslint-disable-next-line max-depth
+					if (Type(namedCaptures) === 'Undefined') {
+						result += '$<';
+						i += 2;
+					} else {
+						var endIndex = $indexOf(replacement, '>', i);
+						// eslint-disable-next-line max-depth
+						if (endIndex > -1) {
+							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
+							var capture = Get(namedCaptures, groupName);
+							// eslint-disable-next-line max-depth
+							if (Type(capture) !== 'Undefined') {
+								result += ToString(capture);
+							}
+							i += ('<' + groupName + '>').length;
+						}
+					}
+				} else {
+					result += '$';
+				}
+			}
+		} else {
+			// the final $, or else not a $
+			result += $charAt(replacement, i);
+		}
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2020/GetV.js b/node_modules/es-abstract/2020/GetV.js
new file mode 100644
index 0000000..2d8cc82
--- /dev/null
+++ b/node_modules/es-abstract/2020/GetV.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var ToObject = require('./ToObject');
+
+/**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+
+module.exports = function GetV(V, P) {
+	// 7.3.2.1
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+
+	// 7.3.2.2-3
+	var O = ToObject(V);
+
+	// 7.3.2.4
+	return O[P];
+};
diff --git a/node_modules/es-abstract/2020/HasOwnProperty.js b/node_modules/es-abstract/2020/HasOwnProperty.js
new file mode 100644
index 0000000..04d2849
--- /dev/null
+++ b/node_modules/es-abstract/2020/HasOwnProperty.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var has = require('has');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+
+module.exports = function HasOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return has(O, P);
+};
diff --git a/node_modules/es-abstract/2020/HasProperty.js b/node_modules/es-abstract/2020/HasProperty.js
new file mode 100644
index 0000000..b341654
--- /dev/null
+++ b/node_modules/es-abstract/2020/HasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+
+module.exports = function HasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2020/HourFromTime.js b/node_modules/es-abstract/2020/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/2020/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/2020/InLeapYear.js b/node_modules/es-abstract/2020/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/2020/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/2020/InstanceofOperator.js b/node_modules/es-abstract/2020/InstanceofOperator.js
new file mode 100644
index 0000000..a3c4d23
--- /dev/null
+++ b/node_modules/es-abstract/2020/InstanceofOperator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var OrdinaryHasInstance = require('./OrdinaryHasInstance');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+
+module.exports = function InstanceofOperator(O, C) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
+	if (typeof instOfHandler !== 'undefined') {
+		return ToBoolean(Call(instOfHandler, C, [O]));
+	}
+	if (!IsCallable(C)) {
+		throw new $TypeError('`C` is not Callable');
+	}
+	return OrdinaryHasInstance(C, O);
+};
diff --git a/node_modules/es-abstract/2020/Invoke.js b/node_modules/es-abstract/2020/Invoke.js
new file mode 100644
index 0000000..d4214ee
--- /dev/null
+++ b/node_modules/es-abstract/2020/Invoke.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var IsArray = require('./IsArray');
+var GetV = require('./GetV');
+var IsPropertyKey = require('./IsPropertyKey');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-invoke
+
+module.exports = function Invoke(O, P) {
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	var argumentsList = arguments.length > 2 ? arguments[2] : [];
+	if (!IsArray(argumentsList)) {
+		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
+	}
+	var func = GetV(O, P);
+	return Call(func, O, argumentsList);
+};
diff --git a/node_modules/es-abstract/2020/IsAccessorDescriptor.js b/node_modules/es-abstract/2020/IsAccessorDescriptor.js
new file mode 100644
index 0000000..78563e7
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/IsArray.js b/node_modules/es-abstract/2020/IsArray.js
new file mode 100644
index 0000000..f933cec
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsArray.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Array = GetIntrinsic('%Array%');
+
+// eslint-disable-next-line global-require
+var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isarray
+
+module.exports = $Array.isArray || function IsArray(argument) {
+	return toStr(argument) === '[object Array]';
+};
diff --git a/node_modules/es-abstract/2020/IsBigIntElementType.js b/node_modules/es-abstract/2020/IsBigIntElementType.js
new file mode 100644
index 0000000..e3f58a9
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsBigIntElementType.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://262.ecma-international.org/11.0/#sec-isbigintelementtype
+
+module.exports = function IsBigIntElementType(type) {
+	return type === 'BigUint64' || type === 'BigInt64';
+};
diff --git a/node_modules/es-abstract/2020/IsCallable.js b/node_modules/es-abstract/2020/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/2020/IsConcatSpreadable.js b/node_modules/es-abstract/2020/IsConcatSpreadable.js
new file mode 100644
index 0000000..141b334
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsConcatSpreadable.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);
+
+var Get = require('./Get');
+var IsArray = require('./IsArray');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+
+module.exports = function IsConcatSpreadable(O) {
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	if ($isConcatSpreadable) {
+		var spreadable = Get(O, $isConcatSpreadable);
+		if (typeof spreadable !== 'undefined') {
+			return ToBoolean(spreadable);
+		}
+	}
+	return IsArray(O);
+};
diff --git a/node_modules/es-abstract/2020/IsConstructor.js b/node_modules/es-abstract/2020/IsConstructor.js
new file mode 100644
index 0000000..fe626e1
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsConstructor.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic.js');
+
+var $construct = GetIntrinsic('%Reflect.construct%', true);
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+try {
+	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
+} catch (e) {
+	// Accessor properties aren't supported
+	DefinePropertyOrThrow = null;
+}
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor
+
+if (DefinePropertyOrThrow && $construct) {
+	var isConstructorMarker = {};
+	var badArrayLike = {};
+	DefinePropertyOrThrow(badArrayLike, 'length', {
+		'[[Get]]': function () {
+			throw isConstructorMarker;
+		},
+		'[[Enumerable]]': true
+	});
+
+	module.exports = function IsConstructor(argument) {
+		try {
+			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
+			$construct(argument, badArrayLike);
+		} catch (err) {
+			return err === isConstructorMarker;
+		}
+	};
+} else {
+	module.exports = function IsConstructor(argument) {
+		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
+		return typeof argument === 'function' && !!argument.prototype;
+	};
+}
diff --git a/node_modules/es-abstract/2020/IsDataDescriptor.js b/node_modules/es-abstract/2020/IsDataDescriptor.js
new file mode 100644
index 0000000..00d14a6
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var assertRecord = require('../helpers/assertRecord');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/IsExtensible.js b/node_modules/es-abstract/2020/IsExtensible.js
new file mode 100644
index 0000000..9df5b80
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsExtensible.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $preventExtensions = $Object.preventExtensions;
+var $isExtensible = $Object.isExtensible;
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o
+
+module.exports = $preventExtensions
+	? function IsExtensible(obj) {
+		return !isPrimitive(obj) && $isExtensible(obj);
+	}
+	: function IsExtensible(obj) {
+		return !isPrimitive(obj);
+	};
diff --git a/node_modules/es-abstract/2020/IsGenericDescriptor.js b/node_modules/es-abstract/2020/IsGenericDescriptor.js
new file mode 100644
index 0000000..95b1d35
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var assertRecord = require('../helpers/assertRecord');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/2020/IsInteger.js b/node_modules/es-abstract/2020/IsInteger.js
new file mode 100644
index 0000000..f4d1a2a
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsInteger.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isinteger
+
+module.exports = function IsInteger(argument) {
+	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+		return false;
+	}
+	var absValue = abs(argument);
+	return floor(absValue) === absValue;
+};
diff --git a/node_modules/es-abstract/2020/IsNoTearConfiguration.js b/node_modules/es-abstract/2020/IsNoTearConfiguration.js
new file mode 100644
index 0000000..f0d2808
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsNoTearConfiguration.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var IsUnclampedIntegerElementType = require('./IsUnclampedIntegerElementType');
+var IsBigIntElementType = require('./IsBigIntElementType');
+
+// https://262.ecma-international.org/11.0/#sec-isnotearconfiguration
+
+module.exports = function IsNoTearConfiguration(type, order) {
+	if (IsUnclampedIntegerElementType(type)) {
+		return true;
+	}
+	if (IsBigIntElementType(type) && order !== 'Init' && order !== 'Unordered') {
+		return true;
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/2020/IsNonNegativeInteger.js b/node_modules/es-abstract/2020/IsNonNegativeInteger.js
new file mode 100644
index 0000000..ae1f69c
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsNonNegativeInteger.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var IsInteger = require('./IsInteger');
+
+// https://262.ecma-international.org/11.0/#sec-isnonnegativeinteger
+
+module.exports = function IsNonNegativeInteger(argument) {
+	return !!IsInteger(argument) && argument >= 0;
+};
diff --git a/node_modules/es-abstract/2020/IsPromise.js b/node_modules/es-abstract/2020/IsPromise.js
new file mode 100644
index 0000000..a551ae0
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsPromise.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $PromiseThen = callBound('Promise.prototype.then', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispromise
+
+module.exports = function IsPromise(x) {
+	if (Type(x) !== 'Object') {
+		return false;
+	}
+	if (!$PromiseThen) { // Promises are not supported
+		return false;
+	}
+	try {
+		$PromiseThen(x); // throws if not a promise
+	} catch (e) {
+		return false;
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/IsPropertyKey.js b/node_modules/es-abstract/2020/IsPropertyKey.js
new file mode 100644
index 0000000..f43ab58
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsPropertyKey.js
@@ -0,0 +1,7 @@
+'use strict';
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey
+
+module.exports = function IsPropertyKey(argument) {
+	return typeof argument === 'string' || typeof argument === 'symbol';
+};
diff --git a/node_modules/es-abstract/2020/IsRegExp.js b/node_modules/es-abstract/2020/IsRegExp.js
new file mode 100644
index 0000000..e105481
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsRegExp.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $match = GetIntrinsic('%Symbol.match%', true);
+
+var hasRegExpMatcher = require('is-regex');
+
+var ToBoolean = require('./ToBoolean');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+
+module.exports = function IsRegExp(argument) {
+	if (!argument || typeof argument !== 'object') {
+		return false;
+	}
+	if ($match) {
+		var isRegExp = argument[$match];
+		if (typeof isRegExp !== 'undefined') {
+			return ToBoolean(isRegExp);
+		}
+	}
+	return hasRegExpMatcher(argument);
+};
diff --git a/node_modules/es-abstract/2020/IsStringPrefix.js b/node_modules/es-abstract/2020/IsStringPrefix.js
new file mode 100644
index 0000000..4958544
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsStringPrefix.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+// var callBound = require('call-bind/callBound');
+
+// var $charAt = callBound('String.prototype.charAt');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-isstringprefix
+
+module.exports = function IsStringPrefix(p, q) {
+	if (Type(p) !== 'String') {
+		throw new $TypeError('Assertion failed: "p" must be a String');
+	}
+
+	if (Type(q) !== 'String') {
+		throw new $TypeError('Assertion failed: "q" must be a String');
+	}
+
+	return isPrefixOf(p, q);
+	/*
+	if (p === q || p === '') {
+		return true;
+	}
+
+	var pLength = p.length;
+	var qLength = q.length;
+	if (pLength >= qLength) {
+		return false;
+	}
+
+	// assert: pLength < qLength
+
+	for (var i = 0; i < pLength; i += 1) {
+		if ($charAt(p, i) !== $charAt(q, i)) {
+			return false;
+		}
+	}
+	return true;
+	*/
+};
diff --git a/node_modules/es-abstract/2020/IsUnclampedIntegerElementType.js b/node_modules/es-abstract/2020/IsUnclampedIntegerElementType.js
new file mode 100644
index 0000000..15237b1
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsUnclampedIntegerElementType.js
@@ -0,0 +1,12 @@
+'use strict';
+
+// https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype
+
+module.exports = function IsUnclampedIntegerElementType(type) {
+	return type === 'Int8'
+        || type === 'Uint8'
+        || type === 'Int16'
+        || type === 'Uint16'
+        || type === 'Int32'
+        || type === 'Uint32';
+};
diff --git a/node_modules/es-abstract/2020/IsUnsignedElementType.js b/node_modules/es-abstract/2020/IsUnsignedElementType.js
new file mode 100644
index 0000000..5eb1e7c
--- /dev/null
+++ b/node_modules/es-abstract/2020/IsUnsignedElementType.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// https://262.ecma-international.org/11.0/#sec-isunsignedelementtype
+
+module.exports = function IsUnsignedElementType(type) {
+	return type === 'Uint8'
+        || type === 'Uint8C'
+        || type === 'Uint16'
+        || type === 'Uint32'
+        || type === 'BigUint64';
+};
diff --git a/node_modules/es-abstract/2020/IterableToList.js b/node_modules/es-abstract/2020/IterableToList.js
new file mode 100644
index 0000000..d994d74
--- /dev/null
+++ b/node_modules/es-abstract/2020/IterableToList.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+var $arrayPush = callBound('Array.prototype.push');
+
+var GetIterator = require('./GetIterator');
+var IteratorStep = require('./IteratorStep');
+var IteratorValue = require('./IteratorValue');
+
+// https://262.ecma-international.org/9.0/#sec-iterabletolist
+
+module.exports = function IterableToList(items, method) {
+	var iterator = GetIterator(items, 'sync', method);
+	var values = [];
+	var next = true;
+	while (next) {
+		next = IteratorStep(iterator);
+		if (next) {
+			var nextValue = IteratorValue(next);
+			$arrayPush(values, nextValue);
+		}
+	}
+	return values;
+};
diff --git a/node_modules/es-abstract/2020/IteratorClose.js b/node_modules/es-abstract/2020/IteratorClose.js
new file mode 100644
index 0000000..dd1118d
--- /dev/null
+++ b/node_modules/es-abstract/2020/IteratorClose.js
@@ -0,0 +1,50 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Call = require('./Call');
+var GetMethod = require('./GetMethod');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+
+module.exports = function IteratorClose(iterator, completion) {
+	if (Type(iterator) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+	}
+	if (!IsCallable(completion)) {
+		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+	}
+	var completionThunk = completion;
+
+	var iteratorReturn = GetMethod(iterator, 'return');
+
+	if (typeof iteratorReturn === 'undefined') {
+		return completionThunk();
+	}
+
+	var completionRecord;
+	try {
+		var innerResult = Call(iteratorReturn, iterator, []);
+	} catch (e) {
+		// if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+		// if the completion is of type "throw", this will throw.
+		completionThunk();
+		completionThunk = null; // ensure it's not called twice.
+
+		// if not, then return the innerResult completion
+		throw e;
+	}
+	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+	completionThunk = null; // ensure it's not called twice.
+
+	if (Type(innerResult) !== 'Object') {
+		throw new $TypeError('iterator .return must return an object');
+	}
+
+	return completionRecord;
+};
diff --git a/node_modules/es-abstract/2020/IteratorComplete.js b/node_modules/es-abstract/2020/IteratorComplete.js
new file mode 100644
index 0000000..ed4efa3
--- /dev/null
+++ b/node_modules/es-abstract/2020/IteratorComplete.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToBoolean = require('./ToBoolean');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+
+module.exports = function IteratorComplete(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return ToBoolean(Get(iterResult, 'done'));
+};
diff --git a/node_modules/es-abstract/2020/IteratorNext.js b/node_modules/es-abstract/2020/IteratorNext.js
new file mode 100644
index 0000000..cf80655
--- /dev/null
+++ b/node_modules/es-abstract/2020/IteratorNext.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Invoke = require('./Invoke');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+
+module.exports = function IteratorNext(iterator, value) {
+	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+	if (Type(result) !== 'Object') {
+		throw new $TypeError('iterator next must return an object');
+	}
+	return result;
+};
diff --git a/node_modules/es-abstract/2020/IteratorStep.js b/node_modules/es-abstract/2020/IteratorStep.js
new file mode 100644
index 0000000..41b9d1b
--- /dev/null
+++ b/node_modules/es-abstract/2020/IteratorStep.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var IteratorComplete = require('./IteratorComplete');
+var IteratorNext = require('./IteratorNext');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+
+module.exports = function IteratorStep(iterator) {
+	var result = IteratorNext(iterator);
+	var done = IteratorComplete(result);
+	return done === true ? false : result;
+};
+
diff --git a/node_modules/es-abstract/2020/IteratorValue.js b/node_modules/es-abstract/2020/IteratorValue.js
new file mode 100644
index 0000000..d15d8ae
--- /dev/null
+++ b/node_modules/es-abstract/2020/IteratorValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+
+module.exports = function IteratorValue(iterResult) {
+	if (Type(iterResult) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+	}
+	return Get(iterResult, 'value');
+};
+
diff --git a/node_modules/es-abstract/2020/LengthOfArrayLike.js b/node_modules/es-abstract/2020/LengthOfArrayLike.js
new file mode 100644
index 0000000..132c4d5
--- /dev/null
+++ b/node_modules/es-abstract/2020/LengthOfArrayLike.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var ToLength = require('./ToLength');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-lengthofarraylike
+
+module.exports = function LengthOfArrayLike(obj) {
+	if (Type(obj) !== 'Object') {
+		throw new $TypeError('Assertion failed: `obj` must be an Object');
+	}
+	return ToLength(Get(obj, 'length'));
+};
+
+// TODO: use this all over
diff --git a/node_modules/es-abstract/2020/MakeDate.js b/node_modules/es-abstract/2020/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/2020/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/2020/MakeDay.js b/node_modules/es-abstract/2020/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/2020/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/2020/MakeTime.js b/node_modules/es-abstract/2020/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/2020/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/2020/MinFromTime.js b/node_modules/es-abstract/2020/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/2020/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/2020/MonthFromTime.js b/node_modules/es-abstract/2020/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/2020/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/2020/Number/add.js b/node_modules/es-abstract/2020/Number/add.js
new file mode 100644
index 0000000..c2c2063
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/add.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-add
+
+module.exports = function NumberAdd(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	if (isNaN(x) || isNaN(y) || (x === Infinity && y === -Infinity) || (x === -Infinity && y === Infinity)) {
+		return NaN;
+	}
+
+	if ((x === Infinity && y === Infinity) || (x === -Infinity && y === -Infinity)) {
+		return x;
+	}
+
+	if (x === Infinity) {
+		return x;
+	}
+
+	if (y === Infinity) {
+		return y;
+	}
+
+	if (x === y && x === 0) {
+		return Infinity / x === -Infinity && Infinity / y === -Infinity ? -0 : +0;
+	}
+
+	if (x === -y || -x === y) {
+		return +0;
+	}
+
+	// shortcut for the actual spec mechanics
+	return x + y;
+};
diff --git a/node_modules/es-abstract/2020/Number/bitwiseAND.js b/node_modules/es-abstract/2020/Number/bitwiseAND.js
new file mode 100644
index 0000000..a715980
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/bitwiseAND.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var NumberBitwiseOp = require('../NumberBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND
+
+module.exports = function NumberBitwiseAND(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	return NumberBitwiseOp('&', x, y);
+};
diff --git a/node_modules/es-abstract/2020/Number/bitwiseNOT.js b/node_modules/es-abstract/2020/Number/bitwiseNOT.js
new file mode 100644
index 0000000..ae8032a
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/bitwiseNOT.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var ToInt32 = require('../ToInt32');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT
+
+module.exports = function NumberBitwiseNOT(x) {
+	if (Type(x) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` argument must be a Number');
+	}
+	var oldValue = ToInt32(x);
+	// Return the result of applying the bitwise operator op to lnum and rnum. The result is a signed 32-bit integer.
+	return ~oldValue;
+};
diff --git a/node_modules/es-abstract/2020/Number/bitwiseOR.js b/node_modules/es-abstract/2020/Number/bitwiseOR.js
new file mode 100644
index 0000000..c5e67b9
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/bitwiseOR.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var NumberBitwiseOp = require('../NumberBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR
+
+module.exports = function NumberBitwiseOR(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	return NumberBitwiseOp('|', x, y);
+};
diff --git a/node_modules/es-abstract/2020/Number/bitwiseXOR.js b/node_modules/es-abstract/2020/Number/bitwiseXOR.js
new file mode 100644
index 0000000..a4030e9
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/bitwiseXOR.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var NumberBitwiseOp = require('../NumberBitwiseOp');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR
+
+module.exports = function NumberBitwiseXOR(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	return NumberBitwiseOp('^', x, y);
+};
diff --git a/node_modules/es-abstract/2020/Number/divide.js b/node_modules/es-abstract/2020/Number/divide.js
new file mode 100644
index 0000000..6524462
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/divide.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isFinite = require('../../helpers/isFinite');
+var isNaN = require('../../helpers/isNaN');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide
+
+module.exports = function NumberDivide(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	if (isNaN(x) || isNaN(y) || (!isFinite(x) && !isFinite(y))) {
+		return NaN;
+	}
+	// shortcut for the actual spec mechanics
+	return x / y;
+};
diff --git a/node_modules/es-abstract/2020/Number/equal.js b/node_modules/es-abstract/2020/Number/equal.js
new file mode 100644
index 0000000..db68afa
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/equal.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal
+
+module.exports = function NumberEqual(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	if (isNaN(x) || isNaN(y)) {
+		return false;
+	}
+	// shortcut for the actual spec mechanics
+	return x === y;
+};
diff --git a/node_modules/es-abstract/2020/Number/exponentiate.js b/node_modules/es-abstract/2020/Number/exponentiate.js
new file mode 100644
index 0000000..bafa7b1
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/exponentiate.js
@@ -0,0 +1,77 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+// var isNegativeZero = require('is-negative-zero');
+
+var $pow = GetIntrinsic('%Math.pow%');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+/*
+var abs = require('../../helpers/abs');
+var isFinite = require('../../helpers/isFinite');
+var isNaN = require('../../helpers/isNaN');
+
+var IsInteger = require('../IsInteger');
+*/
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate
+
+/* eslint max-lines-per-function: 0, max-statements: 0 */
+
+module.exports = function NumberExponentiate(base, exponent) {
+	if (Type(base) !== 'Number' || Type(exponent) !== 'Number') {
+		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be Numbers');
+	}
+	return $pow(base, exponent);
+	/*
+	if (isNaN(exponent)) {
+		return NaN;
+	}
+	if (exponent === 0) {
+		return 1;
+	}
+	if (isNaN(base)) {
+		return NaN;
+	}
+	var aB = abs(base);
+	if (aB > 1 && exponent === Infinity) {
+		return Infinity;
+	}
+	if (aB > 1 && exponent === -Infinity) {
+		return 0;
+	}
+	if (aB === 1 && (exponent === Infinity || exponent === -Infinity)) {
+		return NaN;
+	}
+	if (aB < 1 && exponent === Infinity) {
+		return +0;
+	}
+	if (aB < 1 && exponent === -Infinity) {
+		return Infinity;
+	}
+	if (base === Infinity) {
+		return exponent > 0 ? Infinity : 0;
+	}
+	if (base === -Infinity) {
+		var isOdd = true;
+		if (exponent > 0) {
+			return isOdd ? -Infinity : Infinity;
+		}
+		return isOdd ? -0 : 0;
+	}
+	if (exponent > 0) {
+		return isNegativeZero(base) ? Infinity : 0;
+	}
+	if (isNegativeZero(base)) {
+		if (exponent > 0) {
+			return isOdd ? -0 : 0;
+		}
+		return isOdd ? -Infinity : Infinity;
+	}
+	if (base < 0 && isFinite(base) && isFinite(exponent) && !IsInteger(exponent)) {
+		return NaN;
+    }
+    */
+};
diff --git a/node_modules/es-abstract/2020/Number/index.js b/node_modules/es-abstract/2020/Number/index.js
new file mode 100644
index 0000000..63ec52d
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/index.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var add = require('./add');
+var bitwiseAND = require('./bitwiseAND');
+var bitwiseNOT = require('./bitwiseNOT');
+var bitwiseOR = require('./bitwiseOR');
+var bitwiseXOR = require('./bitwiseXOR');
+var divide = require('./divide');
+var equal = require('./equal');
+var exponentiate = require('./exponentiate');
+var leftShift = require('./leftShift');
+var lessThan = require('./lessThan');
+var multiply = require('./multiply');
+var remainder = require('./remainder');
+var sameValue = require('./sameValue');
+var sameValueZero = require('./sameValueZero');
+var signedRightShift = require('./signedRightShift');
+var subtract = require('./subtract');
+var toString = require('./toString');
+var unaryMinus = require('./unaryMinus');
+var unsignedRightShift = require('./unsignedRightShift');
+
+module.exports = {
+	add: add,
+	bitwiseAND: bitwiseAND,
+	bitwiseNOT: bitwiseNOT,
+	bitwiseOR: bitwiseOR,
+	bitwiseXOR: bitwiseXOR,
+	divide: divide,
+	equal: equal,
+	exponentiate: exponentiate,
+	leftShift: leftShift,
+	lessThan: lessThan,
+	multiply: multiply,
+	remainder: remainder,
+	sameValue: sameValue,
+	sameValueZero: sameValueZero,
+	signedRightShift: signedRightShift,
+	subtract: subtract,
+	toString: toString,
+	unaryMinus: unaryMinus,
+	unsignedRightShift: unsignedRightShift
+};
diff --git a/node_modules/es-abstract/2020/Number/leftShift.js b/node_modules/es-abstract/2020/Number/leftShift.js
new file mode 100644
index 0000000..804fde4
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/leftShift.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var ToInt32 = require('../ToInt32');
+var ToUint32 = require('../ToUint32');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-leftShift
+
+module.exports = function NumberLeftShift(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	var lnum = ToInt32(x);
+	var rnum = ToUint32(y);
+
+	var shiftCount = rnum & 0x1F;
+
+	return lnum << shiftCount;
+};
diff --git a/node_modules/es-abstract/2020/Number/lessThan.js b/node_modules/es-abstract/2020/Number/lessThan.js
new file mode 100644
index 0000000..5fcac24
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/lessThan.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan
+
+module.exports = function NumberLessThan(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	// If x is NaN, return undefined.
+	// If y is NaN, return undefined.
+	if (isNaN(x) || isNaN(y)) {
+		return void undefined;
+	}
+
+	// shortcut for the actual spec mechanics
+	return x < y;
+};
diff --git a/node_modules/es-abstract/2020/Number/multiply.js b/node_modules/es-abstract/2020/Number/multiply.js
new file mode 100644
index 0000000..2a6c478
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/multiply.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply
+
+module.exports = function NumberMultiply(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	if (isNaN(x) || isNaN(y) || (x === 0 && !isFinite(y)) || (!isFinite(x) && y === 0)) {
+		return NaN;
+	}
+	if (!isFinite(x) && !isFinite(y)) {
+		return x === y ? Infinity : -Infinity;
+	}
+	if (!isFinite(x) && y !== 0) {
+		return x > 0 ? Infinity : -Infinity;
+	}
+	if (!isFinite(y) && x !== 0) {
+		return y > 0 ? Infinity : -Infinity;
+	}
+
+	// shortcut for the actual spec mechanics
+	return x * y;
+};
diff --git a/node_modules/es-abstract/2020/Number/remainder.js b/node_modules/es-abstract/2020/Number/remainder.js
new file mode 100644
index 0000000..bc61064
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/remainder.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-remainder
+
+module.exports = function NumberRemainder(n, d) {
+	if (Type(n) !== 'Number' || Type(d) !== 'Number') {
+		throw new $TypeError('Assertion failed: `n` and `d` arguments must be Numbers');
+	}
+
+	// If either operand is NaN, the result is NaN.
+	// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
+	if (isNaN(n) || isNaN(d) || !isFinite(n) || d === 0) {
+		return NaN;
+	}
+
+	// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
+	// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
+	if (!isFinite(d) || (n === 0 && d !== 0)) {
+		return n;
+	}
+
+	// In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved…
+	return n % d;
+};
diff --git a/node_modules/es-abstract/2020/Number/sameValue.js b/node_modules/es-abstract/2020/Number/sameValue.js
new file mode 100644
index 0000000..19efc37
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/sameValue.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var isNegativeZero = require('is-negative-zero');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+var NumberSameValueZero = require('./sameValueZero');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue
+
+module.exports = function NumberSameValue(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	if (x === 0 && y === 0) {
+		return !(isNegativeZero(x) ^ isNegativeZero(y));
+	}
+	return NumberSameValueZero(x, y);
+};
diff --git a/node_modules/es-abstract/2020/Number/sameValueZero.js b/node_modules/es-abstract/2020/Number/sameValueZero.js
new file mode 100644
index 0000000..5688198
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/sameValueZero.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero
+
+module.exports = function NumberSameValueZero(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	var xNaN = isNaN(x);
+	var yNaN = isNaN(y);
+	if (xNaN || yNaN) {
+		return xNaN === yNaN;
+	}
+	return x === y;
+};
diff --git a/node_modules/es-abstract/2020/Number/signedRightShift.js b/node_modules/es-abstract/2020/Number/signedRightShift.js
new file mode 100644
index 0000000..043ca89
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/signedRightShift.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var ToInt32 = require('../ToInt32');
+var ToUint32 = require('../ToUint32');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-signedRightShift
+
+module.exports = function NumberSignedRightShift(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	var lnum = ToInt32(x);
+	var rnum = ToUint32(y);
+
+	var shiftCount = rnum & 0x1F;
+
+	return lnum >> shiftCount;
+};
diff --git a/node_modules/es-abstract/2020/Number/subtract.js b/node_modules/es-abstract/2020/Number/subtract.js
new file mode 100644
index 0000000..3ff2dd2
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/subtract.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-subtract
+
+module.exports = function NumberSubtract(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	return x - y;
+};
diff --git a/node_modules/es-abstract/2020/Number/toString.js b/node_modules/es-abstract/2020/Number/toString.js
new file mode 100644
index 0000000..4f13316
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/toString.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring
+
+module.exports = function NumberToString(x) {
+	if (Type(x) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` must be a Number');
+	}
+
+	return $String(x);
+};
diff --git a/node_modules/es-abstract/2020/Number/unaryMinus.js b/node_modules/es-abstract/2020/Number/unaryMinus.js
new file mode 100644
index 0000000..794582a
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/unaryMinus.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isNaN = require('../../helpers/isNaN');
+
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus
+
+module.exports = function NumberUnaryMinus(x) {
+	if (Type(x) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` argument must be a Number');
+	}
+	if (isNaN(x)) {
+		return NaN;
+	}
+	return -x;
+};
diff --git a/node_modules/es-abstract/2020/Number/unsignedRightShift.js b/node_modules/es-abstract/2020/Number/unsignedRightShift.js
new file mode 100644
index 0000000..874439e
--- /dev/null
+++ b/node_modules/es-abstract/2020/Number/unsignedRightShift.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var ToInt32 = require('../ToInt32');
+var ToUint32 = require('../ToUint32');
+var Type = require('../Type');
+
+// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unsignedRightShift
+
+module.exports = function NumberUnsignedRightShift(x, y) {
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+
+	var lnum = ToInt32(x);
+	var rnum = ToUint32(y);
+
+	var shiftCount = rnum & 0x1F;
+
+	return lnum >>> shiftCount;
+};
diff --git a/node_modules/es-abstract/2020/NumberBitwiseOp.js b/node_modules/es-abstract/2020/NumberBitwiseOp.js
new file mode 100644
index 0000000..11425ff
--- /dev/null
+++ b/node_modules/es-abstract/2020/NumberBitwiseOp.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var ToInt32 = require('./ToInt32');
+var ToUint32 = require('./ToUint32');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-numberbitwiseop
+
+module.exports = function NumberBitwiseOp(op, x, y) {
+	if (op !== '&' && op !== '|' && op !== '^') {
+		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
+	}
+	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
+		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
+	}
+	var lnum = ToInt32(x);
+	var rnum = ToUint32(y);
+	if (op === '&') {
+		return lnum & rnum;
+	}
+	if (op === '|') {
+		return lnum | rnum;
+	}
+	return lnum ^ rnum;
+};
diff --git a/node_modules/es-abstract/2020/NumberToBigInt.js b/node_modules/es-abstract/2020/NumberToBigInt.js
new file mode 100644
index 0000000..a186988
--- /dev/null
+++ b/node_modules/es-abstract/2020/NumberToBigInt.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $BigInt = GetIntrinsic('%BigInt%', true);
+var $RangeError = GetIntrinsic('%RangeError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-numbertobigint
+
+module.exports = function NumberToBigInt(number) {
+	if (Type(number) !== 'Number') {
+		throw new $TypeError('Assertion failed: `number` must be a String');
+	}
+	if (!IsInteger(number)) {
+		throw new $RangeError('The number ' + number + ' cannot be converted to a BigInt because it is not an integer');
+	}
+	return $BigInt(number);
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryCreateFromConstructor.js b/node_modules/es-abstract/2020/OrdinaryCreateFromConstructor.js
new file mode 100644
index 0000000..8f3bb82
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryCreateFromConstructor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
+var IsArray = require('./IsArray');
+var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
+
+// https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor
+
+module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
+	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
+	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
+	var slots = arguments.length < 3 ? [] : arguments[2];
+	if (!IsArray(slots)) {
+		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
+	}
+	return OrdinaryObjectCreate(proto, slots);
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryDefineOwnProperty.js b/node_modules/es-abstract/2020/OrdinaryDefineOwnProperty.js
new file mode 100644
index 0000000..5d33aa6
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryDefineOwnProperty.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var IsPropertyKey = require('./IsPropertyKey');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty
+
+module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (!$gOPD) {
+		// ES3/IE 8 fallback
+		if (IsAccessorDescriptor(Desc)) {
+			throw new $SyntaxError('This environment does not support accessor property descriptors.');
+		}
+		var creatingNormalDataProperty = !(P in O)
+			&& Desc['[[Writable]]']
+			&& Desc['[[Enumerable]]']
+			&& Desc['[[Configurable]]']
+			&& '[[Value]]' in Desc;
+		var settingExistingDataProperty = (P in O)
+			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
+			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
+			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
+			&& '[[Value]]' in Desc;
+		if (creatingNormalDataProperty || settingExistingDataProperty) {
+			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
+			return SameValue(O[P], Desc['[[Value]]']);
+		}
+		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
+	}
+	var desc = $gOPD(O, P);
+	var current = desc && ToPropertyDescriptor(desc);
+	var extensible = IsExtensible(O);
+	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryGetOwnProperty.js b/node_modules/es-abstract/2020/OrdinaryGetOwnProperty.js
new file mode 100644
index 0000000..3d11e9f
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryGetOwnProperty.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+var has = require('has');
+
+var IsArray = require('./IsArray');
+var IsPropertyKey = require('./IsPropertyKey');
+var IsRegExp = require('./IsRegExp');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty
+
+module.exports = function OrdinaryGetOwnProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	if (!has(O, P)) {
+		return void 0;
+	}
+	if (!$gOPD) {
+		// ES3 / IE 8 fallback
+		var arrayLength = IsArray(O) && P === 'length';
+		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
+		return {
+			'[[Configurable]]': !(arrayLength || regexLastIndex),
+			'[[Enumerable]]': $isEnumerable(O, P),
+			'[[Value]]': O[P],
+			'[[Writable]]': true
+		};
+	}
+	return ToPropertyDescriptor($gOPD(O, P));
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryGetPrototypeOf.js b/node_modules/es-abstract/2020/OrdinaryGetPrototypeOf.js
new file mode 100644
index 0000000..ba17b98
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryGetPrototypeOf.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $getProto = require('../helpers/getProto');
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof
+
+module.exports = function OrdinaryGetPrototypeOf(O) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be an Object');
+	}
+	if (!$getProto) {
+		throw new $TypeError('This environment does not support fetching prototypes.');
+	}
+	return $getProto(O);
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryHasInstance.js b/node_modules/es-abstract/2020/OrdinaryHasInstance.js
new file mode 100644
index 0000000..85a240c
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryHasInstance.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance
+
+module.exports = function OrdinaryHasInstance(C, O) {
+	if (IsCallable(C) === false) {
+		return false;
+	}
+	if (Type(O) !== 'Object') {
+		return false;
+	}
+	var P = Get(C, 'prototype');
+	if (Type(P) !== 'Object') {
+		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
+	}
+	return O instanceof C;
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryHasProperty.js b/node_modules/es-abstract/2020/OrdinaryHasProperty.js
new file mode 100644
index 0000000..dd09ca3
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryHasProperty.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty
+
+module.exports = function OrdinaryHasProperty(O, P) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: P must be a Property Key');
+	}
+	return P in O;
+};
diff --git a/node_modules/es-abstract/2020/OrdinaryObjectCreate.js b/node_modules/es-abstract/2020/OrdinaryObjectCreate.js
new file mode 100644
index 0000000..34810cd
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinaryObjectCreate.js
@@ -0,0 +1,46 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $ObjectCreate = GetIntrinsic('%Object.create%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var IsArray = require('./IsArray');
+var Type = require('./Type');
+
+var hasProto = !({ __proto__: null } instanceof Object);
+
+// https://262.ecma-international.org/6.0/#sec-objectcreate
+
+module.exports = function OrdinaryObjectCreate(proto) {
+	if (proto !== null && Type(proto) !== 'Object') {
+		throw new $TypeError('Assertion failed: `proto` must be null or an object');
+	}
+	var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1];
+	if (!IsArray(additionalInternalSlotsList)) {
+		throw new $TypeError('Assertion failed: `additionalInternalSlotsList` must be an Array');
+	}
+	// var internalSlotsList = ['[[Prototype]]', '[[Extensible]]'];
+	if (additionalInternalSlotsList.length > 0) {
+		throw new $SyntaxError('es-abstract does not yet support internal slots');
+		// internalSlotsList.push(...additionalInternalSlotsList);
+	}
+	// var O = MakeBasicObject(internalSlotsList);
+	// setProto(O, proto);
+	// return O;
+
+	if ($ObjectCreate) {
+		return $ObjectCreate(proto);
+	}
+	if (hasProto) {
+		return { __proto__: proto };
+	}
+
+	if (proto === null) {
+		throw new $SyntaxError('native Object.create support is required to create null objects');
+	}
+	var T = function T() {};
+	T.prototype = proto;
+	return new T();
+};
diff --git a/node_modules/es-abstract/2020/OrdinarySetPrototypeOf.js b/node_modules/es-abstract/2020/OrdinarySetPrototypeOf.js
new file mode 100644
index 0000000..d0ff7a7
--- /dev/null
+++ b/node_modules/es-abstract/2020/OrdinarySetPrototypeOf.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $setProto = require('../helpers/setProto');
+
+var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof
+
+module.exports = function OrdinarySetPrototypeOf(O, V) {
+	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
+		throw new $TypeError('Assertion failed: V must be Object or Null');
+	}
+	/*
+    var extensible = IsExtensible(O);
+    var current = OrdinaryGetPrototypeOf(O);
+    if (SameValue(V, current)) {
+        return true;
+    }
+    if (!extensible) {
+        return false;
+    }
+    */
+	try {
+		$setProto(O, V);
+	} catch (e) {
+		return false;
+	}
+	return OrdinaryGetPrototypeOf(O) === V;
+	/*
+    var p = V;
+    var done = false;
+    while (!done) {
+        if (p === null) {
+            done = true;
+        } else if (SameValue(p, O)) {
+            return false;
+        } else {
+            if (wat) {
+                done = true;
+            } else {
+                p = p.[[Prototype]];
+            }
+        }
+     }
+     O.[[Prototype]] = V;
+     return true;
+     */
+};
diff --git a/node_modules/es-abstract/2020/PromiseResolve.js b/node_modules/es-abstract/2020/PromiseResolve.js
new file mode 100644
index 0000000..6474b79
--- /dev/null
+++ b/node_modules/es-abstract/2020/PromiseResolve.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBind = require('call-bind');
+
+var $resolve = GetIntrinsic('%Promise.resolve%', true);
+var $PromiseResolve = $resolve && callBind($resolve);
+
+// https://262.ecma-international.org/9.0/#sec-promise-resolve
+
+module.exports = function PromiseResolve(C, x) {
+	if (!$PromiseResolve) {
+		throw new SyntaxError('This environment does not support Promises.');
+	}
+	return $PromiseResolve(C, x);
+};
+
diff --git a/node_modules/es-abstract/2020/QuoteJSONString.js b/node_modules/es-abstract/2020/QuoteJSONString.js
new file mode 100644
index 0000000..c7ac054
--- /dev/null
+++ b/node_modules/es-abstract/2020/QuoteJSONString.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var forEach = require('../helpers/forEach');
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+
+var Type = require('./Type');
+var UnicodeEscape = require('./UnicodeEscape');
+var UTF16Encoding = require('./UTF16Encoding');
+var UTF16DecodeString = require('./UTF16DecodeString');
+
+var has = require('has');
+
+// https://262.ecma-international.org/11.0/#sec-quotejsonstring
+
+var escapes = {
+	'\u0008': '\\b',
+	'\u0009': '\\t',
+	'\u000A': '\\n',
+	'\u000C': '\\f',
+	'\u000D': '\\r',
+	'\u0022': '\\"',
+	'\u005c': '\\\\'
+};
+
+module.exports = function QuoteJSONString(value) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `value` must be a String');
+	}
+	var product = '"';
+	if (value) {
+		forEach(UTF16DecodeString(value), function (C) {
+			if (has(escapes, C)) {
+				product += escapes[C];
+			} else {
+				var cCharCode = $charCodeAt(C, 0);
+				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
+					product += UnicodeEscape(C);
+				} else {
+					product += UTF16Encoding(cCharCode);
+				}
+			}
+		});
+	}
+	product += '"';
+	return product;
+};
diff --git a/node_modules/es-abstract/2020/RegExpCreate.js b/node_modules/es-abstract/2020/RegExpCreate.js
new file mode 100644
index 0000000..68e3160
--- /dev/null
+++ b/node_modules/es-abstract/2020/RegExpCreate.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RegExp = GetIntrinsic('%RegExp%');
+
+// var RegExpAlloc = require('./RegExpAlloc');
+// var RegExpInitialize = require('./RegExpInitialize');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/6.0/#sec-regexpcreate
+
+module.exports = function RegExpCreate(P, F) {
+	// var obj = RegExpAlloc($RegExp);
+	// return RegExpInitialize(obj, P, F);
+
+	// covers spec mechanics; bypass regex brand checking
+	var pattern = typeof P === 'undefined' ? '' : ToString(P);
+	var flags = typeof F === 'undefined' ? '' : ToString(F);
+	return new $RegExp(pattern, flags);
+};
diff --git a/node_modules/es-abstract/2020/RegExpExec.js b/node_modules/es-abstract/2020/RegExpExec.js
new file mode 100644
index 0000000..29fee17
--- /dev/null
+++ b/node_modules/es-abstract/2020/RegExpExec.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');
+
+var Call = require('./Call');
+var Get = require('./Get');
+var IsCallable = require('./IsCallable');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+
+module.exports = function RegExpExec(R, S) {
+	if (Type(R) !== 'Object') {
+		throw new $TypeError('Assertion failed: `R` must be an Object');
+	}
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	var exec = Get(R, 'exec');
+	if (IsCallable(exec)) {
+		var result = Call(exec, R, [S]);
+		if (result === null || Type(result) === 'Object') {
+			return result;
+		}
+		throw new $TypeError('"exec" method must return `null` or an Object');
+	}
+	return regexExec(R, S);
+};
diff --git a/node_modules/es-abstract/2020/RequireObjectCoercible.js b/node_modules/es-abstract/2020/RequireObjectCoercible.js
new file mode 100644
index 0000000..9008359
--- /dev/null
+++ b/node_modules/es-abstract/2020/RequireObjectCoercible.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../5/CheckObjectCoercible');
diff --git a/node_modules/es-abstract/2020/SameValue.js b/node_modules/es-abstract/2020/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/2020/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/2020/SameValueNonNumeric.js b/node_modules/es-abstract/2020/SameValueNonNumeric.js
new file mode 100644
index 0000000..f7ef12c
--- /dev/null
+++ b/node_modules/es-abstract/2020/SameValueNonNumeric.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric
+
+module.exports = function SameValueNonNumeric(x, y) {
+	var xType = Type(x);
+	if (xType === 'Number' || xType === 'Bigint') {
+		throw new $TypeError('Assertion failed: SameValueNonNumeric does not accept Number or BigInt values');
+	}
+	if (xType !== Type(y)) {
+		throw new $TypeError('SameValueNonNumeric requires two non-numeric values of the same type.');
+	}
+	return SameValue(x, y);
+};
diff --git a/node_modules/es-abstract/2020/SameValueZero.js b/node_modules/es-abstract/2020/SameValueZero.js
new file mode 100644
index 0000000..bf1a148
--- /dev/null
+++ b/node_modules/es-abstract/2020/SameValueZero.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
+
+module.exports = function SameValueZero(x, y) {
+	return (x === y) || ($isNaN(x) && $isNaN(y));
+};
diff --git a/node_modules/es-abstract/2020/SecFromTime.js b/node_modules/es-abstract/2020/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/2020/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/2020/Set.js b/node_modules/es-abstract/2020/Set.js
new file mode 100644
index 0000000..ea49e81
--- /dev/null
+++ b/node_modules/es-abstract/2020/Set.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+		return false;
+	}
+}());
+
+// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+
+module.exports = function Set(O, P, V, Throw) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: `O` must be an Object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: `P` must be a Property Key');
+	}
+	if (Type(Throw) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
+	}
+	if (Throw) {
+		O[P] = V; // eslint-disable-line no-param-reassign
+		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
+			throw new $TypeError('Attempted to assign to readonly property.');
+		}
+		return true;
+	} else {
+		try {
+			O[P] = V; // eslint-disable-line no-param-reassign
+			return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
+		} catch (e) {
+			return false;
+		}
+	}
+};
diff --git a/node_modules/es-abstract/2020/SetFunctionLength.js b/node_modules/es-abstract/2020/SetFunctionLength.js
new file mode 100644
index 0000000..a471b0c
--- /dev/null
+++ b/node_modules/es-abstract/2020/SetFunctionLength.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var HasOwnProperty = require('./HasOwnProperty');
+var IsExtensible = require('./IsExtensible');
+var IsNonNegativeInteger = require('./IsNonNegativeInteger');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-setfunctionlength
+
+module.exports = function SetFunctionLength(F, length) {
+	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
+		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
+	}
+	if (Type(length) !== 'Number') {
+		throw new $TypeError('Assertion failed: `length` must be a Number');
+	}
+	if (!IsNonNegativeInteger(length)) {
+		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
+	}
+	return DefinePropertyOrThrow(F, 'length', {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+};
diff --git a/node_modules/es-abstract/2020/SetFunctionName.js b/node_modules/es-abstract/2020/SetFunctionName.js
new file mode 100644
index 0000000..f59cb7b
--- /dev/null
+++ b/node_modules/es-abstract/2020/SetFunctionName.js
@@ -0,0 +1,44 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var getSymbolDescription = require('../helpers/getSymbolDescription');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsExtensible = require('./IsExtensible');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname
+
+module.exports = function SetFunctionName(F, name) {
+	if (typeof F !== 'function') {
+		throw new $TypeError('Assertion failed: `F` must be a function');
+	}
+	if (!IsExtensible(F) || has(F, 'name')) {
+		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
+	}
+	var nameType = Type(name);
+	if (nameType !== 'Symbol' && nameType !== 'String') {
+		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
+	}
+	if (nameType === 'Symbol') {
+		var description = getSymbolDescription(name);
+		// eslint-disable-next-line no-param-reassign
+		name = typeof description === 'undefined' ? '' : '[' + description + ']';
+	}
+	if (arguments.length > 2) {
+		var prefix = arguments[2];
+		// eslint-disable-next-line no-param-reassign
+		name = prefix + ' ' + name;
+	}
+	return DefinePropertyOrThrow(F, 'name', {
+		'[[Value]]': name,
+		'[[Writable]]': false,
+		'[[Enumerable]]': false,
+		'[[Configurable]]': true
+	});
+};
diff --git a/node_modules/es-abstract/2020/SetIntegrityLevel.js b/node_modules/es-abstract/2020/SetIntegrityLevel.js
new file mode 100644
index 0000000..1ac7d61
--- /dev/null
+++ b/node_modules/es-abstract/2020/SetIntegrityLevel.js
@@ -0,0 +1,57 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+
+var forEach = require('../helpers/forEach');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel
+
+module.exports = function SetIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	if (!$preventExtensions) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
+	}
+	var status = $preventExtensions(O);
+	if (!status) {
+		return false;
+	}
+	if (!$gOPN) {
+		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
+	}
+	var theKeys = $gOPN(O);
+	if (level === 'sealed') {
+		forEach(theKeys, function (k) {
+			DefinePropertyOrThrow(O, k, { configurable: false });
+		});
+	} else if (level === 'frozen') {
+		forEach(theKeys, function (k) {
+			var currentDesc = $gOPD(O, k);
+			if (typeof currentDesc !== 'undefined') {
+				var desc;
+				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
+					desc = { configurable: false };
+				} else {
+					desc = { configurable: false, writable: false };
+				}
+				DefinePropertyOrThrow(O, k, desc);
+			}
+		});
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/SpeciesConstructor.js b/node_modules/es-abstract/2020/SpeciesConstructor.js
new file mode 100644
index 0000000..491eb9b
--- /dev/null
+++ b/node_modules/es-abstract/2020/SpeciesConstructor.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $species = GetIntrinsic('%Symbol.species%', true);
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsConstructor = require('./IsConstructor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+
+module.exports = function SpeciesConstructor(O, defaultConstructor) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	var C = O.constructor;
+	if (typeof C === 'undefined') {
+		return defaultConstructor;
+	}
+	if (Type(C) !== 'Object') {
+		throw new $TypeError('O.constructor is not an Object');
+	}
+	var S = $species ? C[$species] : void 0;
+	if (S == null) {
+		return defaultConstructor;
+	}
+	if (IsConstructor(S)) {
+		return S;
+	}
+	throw new $TypeError('no constructor found');
+};
diff --git a/node_modules/es-abstract/2020/SplitMatch.js b/node_modules/es-abstract/2020/SplitMatch.js
new file mode 100644
index 0000000..8ab0535
--- /dev/null
+++ b/node_modules/es-abstract/2020/SplitMatch.js
@@ -0,0 +1,38 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var IsInteger = require('./IsInteger');
+var Type = require('./Type');
+
+var $charAt = callBound('String.prototype.charAt');
+
+// https://262.ecma-international.org/6.0/#sec-splitmatch
+
+module.exports = function SplitMatch(S, q, R) {
+	if (Type(S) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+	if (!IsInteger(q)) {
+		throw new $TypeError('Assertion failed: `q` must be an integer');
+	}
+	if (Type(R) !== 'String') {
+		throw new $TypeError('Assertion failed: `R` must be a String');
+	}
+	var r = R.length;
+	var s = S.length;
+	if (q + r > s) {
+		return false;
+	}
+
+	for (var i = 0; i < r; i += 1) {
+		if ($charAt(S, q + i) !== $charAt(R, i)) {
+			return false;
+		}
+	}
+
+	return q + r;
+};
diff --git a/node_modules/es-abstract/2020/StrictEqualityComparison.js b/node_modules/es-abstract/2020/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/2020/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/2020/StringCreate.js b/node_modules/es-abstract/2020/StringCreate.js
new file mode 100644
index 0000000..da0c0ea
--- /dev/null
+++ b/node_modules/es-abstract/2020/StringCreate.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $StringPrototype = GetIntrinsic('%String.prototype%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
+var Type = require('./Type');
+
+var setProto = require('../helpers/setProto');
+
+// https://262.ecma-international.org/6.0/#sec-stringcreate
+
+module.exports = function StringCreate(value, prototype) {
+	if (Type(value) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a String');
+	}
+
+	var S = $Object(value);
+	if (S !== $StringPrototype) {
+		if (setProto) {
+			setProto(S, prototype);
+		} else {
+			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
+		}
+	}
+
+	var length = value.length;
+	DefinePropertyOrThrow(S, 'length', {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': false,
+		'[[Value]]': length,
+		'[[Writable]]': false
+	});
+
+	return S;
+};
diff --git a/node_modules/es-abstract/2020/StringGetOwnProperty.js b/node_modules/es-abstract/2020/StringGetOwnProperty.js
new file mode 100644
index 0000000..b6f904e
--- /dev/null
+++ b/node_modules/es-abstract/2020/StringGetOwnProperty.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+var $charAt = callBound('String.prototype.charAt');
+var $stringToString = callBound('String.prototype.toString');
+
+var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
+var IsInteger = require('./IsInteger');
+var IsPropertyKey = require('./IsPropertyKey');
+var Type = require('./Type');
+
+var isNegativeZero = require('is-negative-zero');
+
+// https://262.ecma-international.org/8.0/#sec-stringgetownproperty
+
+module.exports = function StringGetOwnProperty(S, P) {
+	var str;
+	if (Type(S) === 'Object') {
+		try {
+			str = $stringToString(S);
+		} catch (e) { /**/ }
+	}
+	if (Type(str) !== 'String') {
+		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
+	}
+	if (!IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+	}
+	if (Type(P) !== 'String') {
+		return void undefined;
+	}
+	var index = CanonicalNumericIndexString(P);
+	var len = str.length;
+	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
+		return void undefined;
+	}
+	var resultStr = $charAt(S, index);
+	return {
+		'[[Configurable]]': false,
+		'[[Enumerable]]': true,
+		'[[Value]]': resultStr,
+		'[[Writable]]': false
+	};
+};
diff --git a/node_modules/es-abstract/2020/StringPad.js b/node_modules/es-abstract/2020/StringPad.js
new file mode 100644
index 0000000..cdf6900
--- /dev/null
+++ b/node_modules/es-abstract/2020/StringPad.js
@@ -0,0 +1,43 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var ToLength = require('./ToLength');
+var ToString = require('./ToString');
+
+var $strSlice = callBound('String.prototype.slice');
+
+// https://262.ecma-international.org/11.0/#sec-stringpad
+
+module.exports = function StringPad(O, maxLength, fillString, placement) {
+	if (placement !== 'start' && placement !== 'end') {
+		throw new $TypeError('Assertion failed: `placement` must be "start" or "end"');
+	}
+	var S = ToString(O);
+	var intMaxLength = ToLength(maxLength);
+	var stringLength = S.length;
+	if (intMaxLength <= stringLength) {
+		return S;
+	}
+	var filler = typeof fillString === 'undefined' ? ' ' : ToString(fillString);
+	if (filler === '') {
+		return S;
+	}
+	var fillLen = intMaxLength - stringLength;
+
+	// the String value consisting of repeated concatenations of filler truncated to length fillLen.
+	var truncatedStringFiller = '';
+	while (truncatedStringFiller.length < fillLen) {
+		truncatedStringFiller += filler;
+	}
+	truncatedStringFiller = $strSlice(truncatedStringFiller, 0, fillLen);
+
+	if (placement === 'start') {
+		return truncatedStringFiller + S;
+	}
+	return S + truncatedStringFiller;
+};
diff --git a/node_modules/es-abstract/2020/SymbolDescriptiveString.js b/node_modules/es-abstract/2020/SymbolDescriptiveString.js
new file mode 100644
index 0000000..1efd131
--- /dev/null
+++ b/node_modules/es-abstract/2020/SymbolDescriptiveString.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolToString = callBound('Symbol.prototype.toString', true);
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring
+
+module.exports = function SymbolDescriptiveString(sym) {
+	if (Type(sym) !== 'Symbol') {
+		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
+	}
+	return $SymbolToString(sym);
+};
diff --git a/node_modules/es-abstract/2020/TestIntegrityLevel.js b/node_modules/es-abstract/2020/TestIntegrityLevel.js
new file mode 100644
index 0000000..cf1649c
--- /dev/null
+++ b/node_modules/es-abstract/2020/TestIntegrityLevel.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var every = require('../helpers/every');
+
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsExtensible = require('./IsExtensible');
+var ToPropertyDescriptor = require('./ToPropertyDescriptor');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel
+
+module.exports = function TestIntegrityLevel(O, level) {
+	if (Type(O) !== 'Object') {
+		throw new $TypeError('Assertion failed: Type(O) is not Object');
+	}
+	if (level !== 'sealed' && level !== 'frozen') {
+		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
+	}
+	var status = IsExtensible(O);
+	if (status) {
+		return false;
+	}
+	var theKeys = $gOPN(O);
+	return theKeys.length === 0 || every(theKeys, function (k) {
+		var currentDesc = $gOPD(O, k);
+		if (typeof currentDesc !== 'undefined') {
+			if (currentDesc.configurable) {
+				return false;
+			}
+			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
+				return false;
+			}
+		}
+		return true;
+	});
+};
diff --git a/node_modules/es-abstract/2020/TimeClip.js b/node_modules/es-abstract/2020/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/2020/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/2020/TimeFromYear.js b/node_modules/es-abstract/2020/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/2020/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/2020/TimeString.js b/node_modules/es-abstract/2020/TimeString.js
new file mode 100644
index 0000000..051c472
--- /dev/null
+++ b/node_modules/es-abstract/2020/TimeString.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var padTimeComponent = require('../helpers/padTimeComponent');
+
+var HourFromTime = require('./HourFromTime');
+var MinFromTime = require('./MinFromTime');
+var SecFromTime = require('./SecFromTime');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-timestring
+
+module.exports = function TimeString(tv) {
+	if (Type(tv) !== 'Number' || $isNaN(tv)) {
+		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
+	}
+	var hour = HourFromTime(tv);
+	var minute = MinFromTime(tv);
+	var second = SecFromTime(tv);
+	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
+};
diff --git a/node_modules/es-abstract/2020/TimeWithinDay.js b/node_modules/es-abstract/2020/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/2020/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/2020/ToBoolean.js b/node_modules/es-abstract/2020/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/2020/ToDateString.js b/node_modules/es-abstract/2020/ToDateString.js
new file mode 100644
index 0000000..e636a9b
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToDateString.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Date = GetIntrinsic('%Date%');
+
+var $isNaN = require('../helpers/isNaN');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-todatestring
+
+module.exports = function ToDateString(tv) {
+	if (Type(tv) !== 'Number') {
+		throw new $TypeError('Assertion failed: `tv` must be a Number');
+	}
+	if ($isNaN(tv)) {
+		return 'Invalid Date';
+	}
+	return $Date(tv);
+};
diff --git a/node_modules/es-abstract/2020/ToIndex.js b/node_modules/es-abstract/2020/ToIndex.js
new file mode 100644
index 0000000..c0185d1
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToIndex.js
@@ -0,0 +1,26 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $RangeError = GetIntrinsic('%RangeError%');
+
+var ToInteger = require('./ToInteger');
+var ToLength = require('./ToLength');
+var SameValue = require('./SameValue');
+
+// https://262.ecma-international.org/12.0/#sec-toindex
+
+module.exports = function ToIndex(value) {
+	if (typeof value === 'undefined') {
+		return 0;
+	}
+	var integerIndex = ToInteger(value);
+	if (integerIndex < 0) {
+		throw new $RangeError('index must be >= 0');
+	}
+	var index = ToLength(integerIndex);
+	if (!SameValue(integerIndex, index)) {
+		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
+	}
+	return index;
+};
diff --git a/node_modules/es-abstract/2020/ToInt16.js b/node_modules/es-abstract/2020/ToInt16.js
new file mode 100644
index 0000000..cb8e793
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToInt16.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint16 = require('./ToUint16');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint16
+
+module.exports = function ToInt16(argument) {
+	var int16bit = ToUint16(argument);
+	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+};
diff --git a/node_modules/es-abstract/2020/ToInt32.js b/node_modules/es-abstract/2020/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/2020/ToInt8.js b/node_modules/es-abstract/2020/ToInt8.js
new file mode 100644
index 0000000..bc452d8
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToInt8.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var ToUint8 = require('./ToUint8');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toint8
+
+module.exports = function ToInt8(argument) {
+	var int8bit = ToUint8(argument);
+	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+};
diff --git a/node_modules/es-abstract/2020/ToInteger.js b/node_modules/es-abstract/2020/ToInteger.js
new file mode 100644
index 0000000..9210af8
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToInteger.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var ES5ToInteger = require('../5/ToInteger');
+
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/11.0/#sec-tointeger
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	if (number !== 0) {
+		number = ES5ToInteger(number);
+	}
+	return number === 0 ? 0 : number;
+};
diff --git a/node_modules/es-abstract/2020/ToLength.js b/node_modules/es-abstract/2020/ToLength.js
new file mode 100644
index 0000000..1bef9be
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToLength.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
+
+var ToInteger = require('./ToInteger');
+
+module.exports = function ToLength(argument) {
+	var len = ToInteger(argument);
+	if (len <= 0) { return 0; } // includes converting -0 to +0
+	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+	return len;
+};
diff --git a/node_modules/es-abstract/2020/ToNumber.js b/node_modules/es-abstract/2020/ToNumber.js
new file mode 100644
index 0000000..e776bb2
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToNumber.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $Number = GetIntrinsic('%Number%');
+var $RegExp = GetIntrinsic('%RegExp%');
+var $parseInteger = GetIntrinsic('%parseInt%');
+
+var callBound = require('call-bind/callBound');
+var regexTester = require('../helpers/regexTester');
+var isPrimitive = require('../helpers/isPrimitive');
+
+var $strSlice = callBound('String.prototype.slice');
+var isBinary = regexTester(/^0b[01]+$/i);
+var isOctal = regexTester(/^0o[0-7]+$/i);
+var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = regexTester(nonWSregex);
+
+// whitespace from: https://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+	'\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var $replace = callBound('String.prototype.replace');
+var $trim = function (value) {
+	return $replace(value, trimRegex, '');
+};
+
+var ToPrimitive = require('./ToPrimitive');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+module.exports = function ToNumber(argument) {
+	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (typeof value === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a number');
+	}
+	if (typeof value === 'string') {
+		if (isBinary(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 2));
+		} else if (isOctal(value)) {
+			return ToNumber($parseInteger($strSlice(value, 2), 8));
+		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+			return NaN;
+		} else {
+			var trimmed = $trim(value);
+			if (trimmed !== value) {
+				return ToNumber(trimmed);
+			}
+		}
+	}
+	return $Number(value);
+};
diff --git a/node_modules/es-abstract/2020/ToNumeric.js b/node_modules/es-abstract/2020/ToNumeric.js
new file mode 100644
index 0000000..c187760
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToNumeric.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+
+var isPrimitive = require('../helpers/isPrimitive');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToNumber = require('./ToNumber');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/6.0/#sec-tonumber
+
+module.exports = function ToNumeric(argument) {
+	var primValue = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
+	if (Type(primValue) === 'BigInt') {
+		return primValue;
+	}
+	return ToNumber(primValue);
+};
diff --git a/node_modules/es-abstract/2020/ToObject.js b/node_modules/es-abstract/2020/ToObject.js
new file mode 100644
index 0000000..cb26bac
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toobject
+
+module.exports = function ToObject(value) {
+	RequireObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/2020/ToPrimitive.js b/node_modules/es-abstract/2020/ToPrimitive.js
new file mode 100644
index 0000000..0fbe9b8
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToPrimitive.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var toPrimitive = require('es-to-primitive/es2015');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
+
+module.exports = function ToPrimitive(input) {
+	if (arguments.length > 1) {
+		return toPrimitive(input, arguments[1]);
+	}
+	return toPrimitive(input);
+};
diff --git a/node_modules/es-abstract/2020/ToPropertyDescriptor.js b/node_modules/es-abstract/2020/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/2020/ToPropertyKey.js b/node_modules/es-abstract/2020/ToPropertyKey.js
new file mode 100644
index 0000000..fc1bf7d
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToPropertyKey.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+var ToPrimitive = require('./ToPrimitive');
+var ToString = require('./ToString');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey
+
+module.exports = function ToPropertyKey(argument) {
+	var key = ToPrimitive(argument, $String);
+	return typeof key === 'symbol' ? key : ToString(key);
+};
diff --git a/node_modules/es-abstract/2020/ToString.js b/node_modules/es-abstract/2020/ToString.js
new file mode 100644
index 0000000..4d494e1
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToString.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-tostring
+
+module.exports = function ToString(argument) {
+	if (typeof argument === 'symbol') {
+		throw new $TypeError('Cannot convert a Symbol value to a string');
+	}
+	return $String(argument);
+};
diff --git a/node_modules/es-abstract/2020/ToUint16.js b/node_modules/es-abstract/2020/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/2020/ToUint32.js b/node_modules/es-abstract/2020/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/2020/ToUint8.js b/node_modules/es-abstract/2020/ToUint8.js
new file mode 100644
index 0000000..2dfd97c
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToUint8.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8
+
+module.exports = function ToUint8(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x100);
+};
diff --git a/node_modules/es-abstract/2020/ToUint8Clamp.js b/node_modules/es-abstract/2020/ToUint8Clamp.js
new file mode 100644
index 0000000..b0b8ce8
--- /dev/null
+++ b/node_modules/es-abstract/2020/ToUint8Clamp.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var floor = require('./floor');
+
+var $isNaN = require('../helpers/isNaN');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp
+
+module.exports = function ToUint8Clamp(argument) {
+	var number = ToNumber(argument);
+	if ($isNaN(number) || number <= 0) { return 0; }
+	if (number >= 0xFF) { return 0xFF; }
+	var f = floor(argument);
+	if (f + 0.5 < number) { return f + 1; }
+	if (number < f + 0.5) { return f; }
+	if (f % 2 !== 0) { return f + 1; }
+	return f;
+};
diff --git a/node_modules/es-abstract/2020/TrimString.js b/node_modules/es-abstract/2020/TrimString.js
new file mode 100644
index 0000000..113dcf8
--- /dev/null
+++ b/node_modules/es-abstract/2020/TrimString.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var trimStart = require('string.prototype.trimstart');
+var trimEnd = require('string.prototype.trimend');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var RequireObjectCoercible = require('./RequireObjectCoercible');
+var ToString = require('./ToString');
+
+// https://262.ecma-international.org/10.0/#sec-trimstring
+
+module.exports = function TrimString(string, where) {
+	var str = RequireObjectCoercible(string);
+	var S = ToString(str);
+	var T;
+	if (where === 'start') {
+		T = trimStart(S);
+	} else if (where === 'end') {
+		T = trimEnd(S);
+	} else if (where === 'start+end') {
+		T = trimStart(trimEnd(S));
+	} else {
+		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
+	}
+	return T;
+};
diff --git a/node_modules/es-abstract/2020/Type.js b/node_modules/es-abstract/2020/Type.js
new file mode 100644
index 0000000..555ca74
--- /dev/null
+++ b/node_modules/es-abstract/2020/Type.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var ES5Type = require('../5/Type');
+
+// https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values
+
+module.exports = function Type(x) {
+	if (typeof x === 'symbol') {
+		return 'Symbol';
+	}
+	if (typeof x === 'bigint') {
+		return 'BigInt';
+	}
+	return ES5Type(x);
+};
diff --git a/node_modules/es-abstract/2020/UTF16DecodeString.js b/node_modules/es-abstract/2020/UTF16DecodeString.js
new file mode 100644
index 0000000..8e27a21
--- /dev/null
+++ b/node_modules/es-abstract/2020/UTF16DecodeString.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $push = callBound('Array.prototype.push');
+
+var CodePointAt = require('./CodePointAt');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodestring
+
+module.exports = function UTF16DecodeString(string) {
+	if (Type(string) !== 'String') {
+		throw new $TypeError('Assertion failed: `string` must be a String');
+	}
+	var codePoints = [];
+	var size = string.length;
+	var position = 0;
+	while (position < size) {
+		var cp = CodePointAt(string, position);
+		$push(codePoints, cp['[[CodePoint]]']);
+		position += cp['[[CodeUnitCount]]'];
+	}
+	return codePoints;
+};
diff --git a/node_modules/es-abstract/2020/UTF16DecodeSurrogatePair.js b/node_modules/es-abstract/2020/UTF16DecodeSurrogatePair.js
new file mode 100644
index 0000000..2632e65
--- /dev/null
+++ b/node_modules/es-abstract/2020/UTF16DecodeSurrogatePair.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
+var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
+
+// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair
+
+module.exports = function UTF16DecodeSurrogatePair(lead, trail) {
+	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
+		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
+	}
+	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+	return $fromCharCode(lead) + $fromCharCode(trail);
+};
diff --git a/node_modules/es-abstract/2020/UTF16Encoding.js b/node_modules/es-abstract/2020/UTF16Encoding.js
new file mode 100644
index 0000000..f381595
--- /dev/null
+++ b/node_modules/es-abstract/2020/UTF16Encoding.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var isCodePoint = require('../helpers/isCodePoint');
+
+// https://262.ecma-international.org/7.0/#sec-utf16encoding
+
+module.exports = function UTF16Encoding(cp) {
+	if (!isCodePoint(cp)) {
+		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
+	}
+	if (cp <= 65535) {
+		return $fromCharCode(cp);
+	}
+	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
+	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
+	return $fromCharCode(cu1) + $fromCharCode(cu2);
+};
diff --git a/node_modules/es-abstract/2020/UnicodeEscape.js b/node_modules/es-abstract/2020/UnicodeEscape.js
new file mode 100644
index 0000000..b708c90
--- /dev/null
+++ b/node_modules/es-abstract/2020/UnicodeEscape.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var callBound = require('call-bind/callBound');
+
+var $charCodeAt = callBound('String.prototype.charCodeAt');
+var $numberToString = callBound('Number.prototype.toString');
+var $toLowerCase = callBound('String.prototype.toLowerCase');
+
+var StringPad = require('./StringPad');
+
+// https://262.ecma-international.org/11.0/#sec-unicodeescape
+
+module.exports = function UnicodeEscape(C) {
+	if (typeof C !== 'string' || C.length !== 1) {
+		throw new $TypeError('Assertion failed: `C` must be a single code unit');
+	}
+	var n = $charCodeAt(C, 0);
+	if (n > 0xFFFF) {
+		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
+	}
+
+	return '\\u' + StringPad($toLowerCase($numberToString(n, 16)), 4, '0', 'start');
+};
diff --git a/node_modules/es-abstract/2020/ValidateAndApplyPropertyDescriptor.js b/node_modules/es-abstract/2020/ValidateAndApplyPropertyDescriptor.js
new file mode 100644
index 0000000..a7fd218
--- /dev/null
+++ b/node_modules/es-abstract/2020/ValidateAndApplyPropertyDescriptor.js
@@ -0,0 +1,170 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var DefineOwnProperty = require('../helpers/DefineOwnProperty');
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');
+
+var FromPropertyDescriptor = require('./FromPropertyDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsGenericDescriptor = require('./IsGenericDescriptor');
+var IsPropertyKey = require('./IsPropertyKey');
+var SameValue = require('./SameValue');
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
+// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor
+
+// eslint-disable-next-line max-lines-per-function, max-statements, max-params
+module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
+	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
+	var oType = Type(O);
+	if (oType !== 'Undefined' && oType !== 'Object') {
+		throw new $TypeError('Assertion failed: O must be undefined or an Object');
+	}
+	if (Type(extensible) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: extensible must be a Boolean');
+	}
+	if (!isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, Desc)) {
+		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
+	}
+	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
+		Type: Type,
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor
+	}, current)) {
+		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
+	}
+	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
+		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
+	}
+	if (Type(current) === 'Undefined') {
+		if (!extensible) {
+			return false;
+		}
+		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': Desc['[[Configurable]]'],
+						'[[Enumerable]]': Desc['[[Enumerable]]'],
+						'[[Value]]': Desc['[[Value]]'],
+						'[[Writable]]': Desc['[[Writable]]']
+					}
+				);
+			}
+		} else {
+			if (!IsAccessorDescriptor(Desc)) {
+				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
+			}
+			if (oType !== 'Undefined') {
+				return DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					Desc
+				);
+			}
+		}
+		return true;
+	}
+	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
+		return true;
+	}
+	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
+		return true; // removed by ES2017, but should still be correct
+	}
+	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
+	if (!current['[[Configurable]]']) {
+		if (Desc['[[Configurable]]']) {
+			return false;
+		}
+		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
+			return false;
+		}
+	}
+	if (IsGenericDescriptor(Desc)) {
+		// no further validation is required.
+	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			return false;
+		}
+		if (IsDataDescriptor(current)) {
+			if (oType !== 'Undefined') {
+				DefineOwnProperty(
+					IsDataDescriptor,
+					SameValue,
+					FromPropertyDescriptor,
+					O,
+					P,
+					{
+						'[[Configurable]]': current['[[Configurable]]'],
+						'[[Enumerable]]': current['[[Enumerable]]'],
+						'[[Get]]': undefined
+					}
+				);
+			}
+		} else if (oType !== 'Undefined') {
+			DefineOwnProperty(
+				IsDataDescriptor,
+				SameValue,
+				FromPropertyDescriptor,
+				O,
+				P,
+				{
+					'[[Configurable]]': current['[[Configurable]]'],
+					'[[Enumerable]]': current['[[Enumerable]]'],
+					'[[Value]]': undefined
+				}
+			);
+		}
+	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
+		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
+			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
+				return false;
+			}
+			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
+		if (!current['[[Configurable]]']) {
+			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
+				return false;
+			}
+			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
+				return false;
+			}
+			return true;
+		}
+	} else {
+		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
+	}
+	if (oType !== 'Undefined') {
+		return DefineOwnProperty(
+			IsDataDescriptor,
+			SameValue,
+			FromPropertyDescriptor,
+			O,
+			P,
+			Desc
+		);
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/2020/WeekDay.js b/node_modules/es-abstract/2020/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/2020/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/2020/YearFromTime.js b/node_modules/es-abstract/2020/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/2020/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/2020/abs.js b/node_modules/es-abstract/2020/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/2020/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/2020/floor.js b/node_modules/es-abstract/2020/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/2020/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/2020/modulo.js b/node_modules/es-abstract/2020/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/2020/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/2020/msFromTime.js b/node_modules/es-abstract/2020/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/2020/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/2020/thisBigIntValue.js b/node_modules/es-abstract/2020/thisBigIntValue.js
new file mode 100644
index 0000000..1fd1298
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisBigIntValue.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $bigIntValueOf = callBound('BigInt.prototype.valueOf', true);
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/11.0/#sec-thisbigintvalue
+
+module.exports = function thisBigIntValue(value) {
+	var type = Type(value);
+	if (type === 'BigInt') {
+		return value;
+	}
+	if (!$bigIntValueOf) {
+		throw new $TypeError('BigInt is not supported');
+	}
+	return $bigIntValueOf(value);
+};
diff --git a/node_modules/es-abstract/2020/thisBooleanValue.js b/node_modules/es-abstract/2020/thisBooleanValue.js
new file mode 100644
index 0000000..27075b9
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisBooleanValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
+
+module.exports = function thisBooleanValue(value) {
+	if (Type(value) === 'Boolean') {
+		return value;
+	}
+
+	return $BooleanValueOf(value);
+};
diff --git a/node_modules/es-abstract/2020/thisNumberValue.js b/node_modules/es-abstract/2020/thisNumberValue.js
new file mode 100644
index 0000000..92968dc
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisNumberValue.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var Type = require('./Type');
+
+var $NumberValueOf = callBound('Number.prototype.valueOf');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
+
+module.exports = function thisNumberValue(value) {
+	if (Type(value) === 'Number') {
+		return value;
+	}
+
+	return $NumberValueOf(value);
+};
+
diff --git a/node_modules/es-abstract/2020/thisStringValue.js b/node_modules/es-abstract/2020/thisStringValue.js
new file mode 100644
index 0000000..8e4274d
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisStringValue.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');
+
+var Type = require('./Type');
+
+// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
+
+module.exports = function thisStringValue(value) {
+	if (Type(value) === 'String') {
+		return value;
+	}
+
+	return $StringValueOf(value);
+};
diff --git a/node_modules/es-abstract/2020/thisSymbolValue.js b/node_modules/es-abstract/2020/thisSymbolValue.js
new file mode 100644
index 0000000..91a5525
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisSymbolValue.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/9.0/#sec-thissymbolvalue
+
+module.exports = function thisSymbolValue(value) {
+	if (!$SymbolValueOf) {
+		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
+	}
+	if (Type(value) === 'Symbol') {
+		return value;
+	}
+	return $SymbolValueOf(value);
+};
diff --git a/node_modules/es-abstract/2020/thisTimeValue.js b/node_modules/es-abstract/2020/thisTimeValue.js
new file mode 100644
index 0000000..a9a47ac
--- /dev/null
+++ b/node_modules/es-abstract/2020/thisTimeValue.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../2018/thisTimeValue');
diff --git a/node_modules/es-abstract/5/AbstractEqualityComparison.js b/node_modules/es-abstract/5/AbstractEqualityComparison.js
new file mode 100644
index 0000000..568bb40
--- /dev/null
+++ b/node_modules/es-abstract/5/AbstractEqualityComparison.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.3
+
+module.exports = function AbstractEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType === yType) {
+		return x === y; // ES6+ specified this shortcut anyways.
+	}
+	if (x == null && y == null) {
+		return true;
+	}
+	if (xType === 'Number' && yType === 'String') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if (xType === 'String' && yType === 'Number') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (xType === 'Boolean') {
+		return AbstractEqualityComparison(ToNumber(x), y);
+	}
+	if (yType === 'Boolean') {
+		return AbstractEqualityComparison(x, ToNumber(y));
+	}
+	if ((xType === 'String' || xType === 'Number') && yType === 'Object') {
+		return AbstractEqualityComparison(x, ToPrimitive(y));
+	}
+	if (xType === 'Object' && (yType === 'String' || yType === 'Number')) {
+		return AbstractEqualityComparison(ToPrimitive(x), y);
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/5/AbstractRelationalComparison.js b/node_modules/es-abstract/5/AbstractRelationalComparison.js
new file mode 100644
index 0000000..0dfed5f
--- /dev/null
+++ b/node_modules/es-abstract/5/AbstractRelationalComparison.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Number = GetIntrinsic('%Number%');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var isPrefixOf = require('../helpers/isPrefixOf');
+
+var ToNumber = require('./ToNumber');
+var ToPrimitive = require('./ToPrimitive');
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.8.5
+
+// eslint-disable-next-line max-statements
+module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
+	if (Type(LeftFirst) !== 'Boolean') {
+		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
+	}
+	var px;
+	var py;
+	if (LeftFirst) {
+		px = ToPrimitive(x, $Number);
+		py = ToPrimitive(y, $Number);
+	} else {
+		py = ToPrimitive(y, $Number);
+		px = ToPrimitive(x, $Number);
+	}
+	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
+	if (!bothStrings) {
+		var nx = ToNumber(px);
+		var ny = ToNumber(py);
+		if ($isNaN(nx) || $isNaN(ny)) {
+			return undefined;
+		}
+		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
+			return false;
+		}
+		if (nx === Infinity) {
+			return false;
+		}
+		if (ny === Infinity) {
+			return true;
+		}
+		if (ny === -Infinity) {
+			return false;
+		}
+		if (nx === -Infinity) {
+			return true;
+		}
+		return nx < ny; // by now, these are both nonzero, finite, and not equal
+	}
+	if (isPrefixOf(py, px)) {
+		return false;
+	}
+	if (isPrefixOf(px, py)) {
+		return true;
+	}
+	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
+};
diff --git a/node_modules/es-abstract/5/CheckObjectCoercible.js b/node_modules/es-abstract/5/CheckObjectCoercible.js
new file mode 100644
index 0000000..9083c71
--- /dev/null
+++ b/node_modules/es-abstract/5/CheckObjectCoercible.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+// http://262.ecma-international.org/5.1/#sec-9.10
+
+module.exports = function CheckObjectCoercible(value, optMessage) {
+	if (value == null) {
+		throw new $TypeError(optMessage || ('Cannot call method on ' + value));
+	}
+	return value;
+};
diff --git a/node_modules/es-abstract/5/DateFromTime.js b/node_modules/es-abstract/5/DateFromTime.js
new file mode 100644
index 0000000..20e4f2e
--- /dev/null
+++ b/node_modules/es-abstract/5/DateFromTime.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+var MonthFromTime = require('./MonthFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.5
+
+module.exports = function DateFromTime(t) {
+	var m = MonthFromTime(t);
+	var d = DayWithinYear(t);
+	if (m === 0) {
+		return d + 1;
+	}
+	if (m === 1) {
+		return d - 30;
+	}
+	var leap = InLeapYear(t);
+	if (m === 2) {
+		return d - 58 - leap;
+	}
+	if (m === 3) {
+		return d - 89 - leap;
+	}
+	if (m === 4) {
+		return d - 119 - leap;
+	}
+	if (m === 5) {
+		return d - 150 - leap;
+	}
+	if (m === 6) {
+		return d - 180 - leap;
+	}
+	if (m === 7) {
+		return d - 211 - leap;
+	}
+	if (m === 8) {
+		return d - 242 - leap;
+	}
+	if (m === 9) {
+		return d - 272 - leap;
+	}
+	if (m === 10) {
+		return d - 303 - leap;
+	}
+	if (m === 11) {
+		return d - 333 - leap;
+	}
+	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
+};
diff --git a/node_modules/es-abstract/5/Day.js b/node_modules/es-abstract/5/Day.js
new file mode 100644
index 0000000..51d0103
--- /dev/null
+++ b/node_modules/es-abstract/5/Day.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var floor = require('./floor');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function Day(t) {
+	return floor(t / msPerDay);
+};
diff --git a/node_modules/es-abstract/5/DayFromYear.js b/node_modules/es-abstract/5/DayFromYear.js
new file mode 100644
index 0000000..341bf22
--- /dev/null
+++ b/node_modules/es-abstract/5/DayFromYear.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var floor = require('./floor');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DayFromYear(y) {
+	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
+};
+
diff --git a/node_modules/es-abstract/5/DayWithinYear.js b/node_modules/es-abstract/5/DayWithinYear.js
new file mode 100644
index 0000000..4c58094
--- /dev/null
+++ b/node_modules/es-abstract/5/DayWithinYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var Day = require('./Day');
+var DayFromYear = require('./DayFromYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function DayWithinYear(t) {
+	return Day(t) - DayFromYear(YearFromTime(t));
+};
diff --git a/node_modules/es-abstract/5/DaysInYear.js b/node_modules/es-abstract/5/DaysInYear.js
new file mode 100644
index 0000000..7116c69
--- /dev/null
+++ b/node_modules/es-abstract/5/DaysInYear.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function DaysInYear(y) {
+	if (modulo(y, 4) !== 0) {
+		return 365;
+	}
+	if (modulo(y, 100) !== 0) {
+		return 366;
+	}
+	if (modulo(y, 400) !== 0) {
+		return 365;
+	}
+	return 366;
+};
diff --git a/node_modules/es-abstract/5/FromPropertyDescriptor.js b/node_modules/es-abstract/5/FromPropertyDescriptor.js
new file mode 100644
index 0000000..506f65c
--- /dev/null
+++ b/node_modules/es-abstract/5/FromPropertyDescriptor.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+
+var assertRecord = require('../helpers/assertRecord');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.4
+
+module.exports = function FromPropertyDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return Desc;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (IsDataDescriptor(Desc)) {
+		return {
+			value: Desc['[[Value]]'],
+			writable: !!Desc['[[Writable]]'],
+			enumerable: !!Desc['[[Enumerable]]'],
+			configurable: !!Desc['[[Configurable]]']
+		};
+	} else if (IsAccessorDescriptor(Desc)) {
+		return {
+			get: Desc['[[Get]]'],
+			set: Desc['[[Set]]'],
+			enumerable: !!Desc['[[Enumerable]]'],
+			configurable: !!Desc['[[Configurable]]']
+		};
+	} else {
+		throw new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
+	}
+};
diff --git a/node_modules/es-abstract/5/HourFromTime.js b/node_modules/es-abstract/5/HourFromTime.js
new file mode 100644
index 0000000..f963bfb
--- /dev/null
+++ b/node_modules/es-abstract/5/HourFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerHour = timeConstants.msPerHour;
+var HoursPerDay = timeConstants.HoursPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function HourFromTime(t) {
+	return modulo(floor(t / msPerHour), HoursPerDay);
+};
diff --git a/node_modules/es-abstract/5/InLeapYear.js b/node_modules/es-abstract/5/InLeapYear.js
new file mode 100644
index 0000000..bfe0c45
--- /dev/null
+++ b/node_modules/es-abstract/5/InLeapYear.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $EvalError = GetIntrinsic('%EvalError%');
+
+var DaysInYear = require('./DaysInYear');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function InLeapYear(t) {
+	var days = DaysInYear(YearFromTime(t));
+	if (days === 365) {
+		return 0;
+	}
+	if (days === 366) {
+		return 1;
+	}
+	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
+};
diff --git a/node_modules/es-abstract/5/IsAccessorDescriptor.js b/node_modules/es-abstract/5/IsAccessorDescriptor.js
new file mode 100644
index 0000000..da64a30
--- /dev/null
+++ b/node_modules/es-abstract/5/IsAccessorDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var Type = require('./Type');
+
+var assertRecord = require('../helpers/assertRecord');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.1
+
+module.exports = function IsAccessorDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/5/IsCallable.js b/node_modules/es-abstract/5/IsCallable.js
new file mode 100644
index 0000000..3a69b19
--- /dev/null
+++ b/node_modules/es-abstract/5/IsCallable.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.11
+
+module.exports = require('is-callable');
diff --git a/node_modules/es-abstract/5/IsDataDescriptor.js b/node_modules/es-abstract/5/IsDataDescriptor.js
new file mode 100644
index 0000000..9db441e
--- /dev/null
+++ b/node_modules/es-abstract/5/IsDataDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var has = require('has');
+
+var Type = require('./Type');
+
+var assertRecord = require('../helpers/assertRecord');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.2
+
+module.exports = function IsDataDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+		return false;
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/5/IsGenericDescriptor.js b/node_modules/es-abstract/5/IsGenericDescriptor.js
new file mode 100644
index 0000000..b47bfc3
--- /dev/null
+++ b/node_modules/es-abstract/5/IsGenericDescriptor.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var Type = require('./Type');
+
+var assertRecord = require('../helpers/assertRecord');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.3
+
+module.exports = function IsGenericDescriptor(Desc) {
+	if (typeof Desc === 'undefined') {
+		return false;
+	}
+
+	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
+
+	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
+		return true;
+	}
+
+	return false;
+};
diff --git a/node_modules/es-abstract/5/IsPropertyDescriptor.js b/node_modules/es-abstract/5/IsPropertyDescriptor.js
new file mode 100644
index 0000000..4cfe79b
--- /dev/null
+++ b/node_modules/es-abstract/5/IsPropertyDescriptor.js
@@ -0,0 +1,19 @@
+'use strict';
+
+// TODO, semver-major: delete this
+
+var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
+
+var Type = require('./Type');
+var IsDataDescriptor = require('./IsDataDescriptor');
+var IsAccessorDescriptor = require('./IsAccessorDescriptor');
+
+// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
+
+module.exports = function IsPropertyDescriptor(Desc) {
+	return isPropertyDescriptor({
+		IsDataDescriptor: IsDataDescriptor,
+		IsAccessorDescriptor: IsAccessorDescriptor,
+		Type: Type
+	}, Desc);
+};
diff --git a/node_modules/es-abstract/5/MakeDate.js b/node_modules/es-abstract/5/MakeDate.js
new file mode 100644
index 0000000..efeb645
--- /dev/null
+++ b/node_modules/es-abstract/5/MakeDate.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.13
+
+module.exports = function MakeDate(day, time) {
+	if (!$isFinite(day) || !$isFinite(time)) {
+		return NaN;
+	}
+	return (day * msPerDay) + time;
+};
diff --git a/node_modules/es-abstract/5/MakeDay.js b/node_modules/es-abstract/5/MakeDay.js
new file mode 100644
index 0000000..13f5686
--- /dev/null
+++ b/node_modules/es-abstract/5/MakeDay.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $DateUTC = GetIntrinsic('%Date.UTC%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var DateFromTime = require('./DateFromTime');
+var Day = require('./Day');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var MonthFromTime = require('./MonthFromTime');
+var ToInteger = require('./ToInteger');
+var YearFromTime = require('./YearFromTime');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.12
+
+module.exports = function MakeDay(year, month, date) {
+	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
+		return NaN;
+	}
+	var y = ToInteger(year);
+	var m = ToInteger(month);
+	var dt = ToInteger(date);
+	var ym = y + floor(m / 12);
+	var mn = modulo(m, 12);
+	var t = $DateUTC(ym, mn, 1);
+	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
+		return NaN;
+	}
+	return Day(t) + dt - 1;
+};
diff --git a/node_modules/es-abstract/5/MakeTime.js b/node_modules/es-abstract/5/MakeTime.js
new file mode 100644
index 0000000..34cb4dc
--- /dev/null
+++ b/node_modules/es-abstract/5/MakeTime.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var $isFinite = require('../helpers/isFinite');
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var msPerMinute = timeConstants.msPerMinute;
+var msPerHour = timeConstants.msPerHour;
+
+var ToInteger = require('./ToInteger');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.11
+
+module.exports = function MakeTime(hour, min, sec, ms) {
+	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
+		return NaN;
+	}
+	var h = ToInteger(hour);
+	var m = ToInteger(min);
+	var s = ToInteger(sec);
+	var milli = ToInteger(ms);
+	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
+	return t;
+};
diff --git a/node_modules/es-abstract/5/MinFromTime.js b/node_modules/es-abstract/5/MinFromTime.js
new file mode 100644
index 0000000..a0c631d
--- /dev/null
+++ b/node_modules/es-abstract/5/MinFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerMinute = timeConstants.msPerMinute;
+var MinutesPerHour = timeConstants.MinutesPerHour;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function MinFromTime(t) {
+	return modulo(floor(t / msPerMinute), MinutesPerHour);
+};
diff --git a/node_modules/es-abstract/5/MonthFromTime.js b/node_modules/es-abstract/5/MonthFromTime.js
new file mode 100644
index 0000000..a482a7d
--- /dev/null
+++ b/node_modules/es-abstract/5/MonthFromTime.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var DayWithinYear = require('./DayWithinYear');
+var InLeapYear = require('./InLeapYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.4
+
+module.exports = function MonthFromTime(t) {
+	var day = DayWithinYear(t);
+	if (0 <= day && day < 31) {
+		return 0;
+	}
+	var leap = InLeapYear(t);
+	if (31 <= day && day < (59 + leap)) {
+		return 1;
+	}
+	if ((59 + leap) <= day && day < (90 + leap)) {
+		return 2;
+	}
+	if ((90 + leap) <= day && day < (120 + leap)) {
+		return 3;
+	}
+	if ((120 + leap) <= day && day < (151 + leap)) {
+		return 4;
+	}
+	if ((151 + leap) <= day && day < (181 + leap)) {
+		return 5;
+	}
+	if ((181 + leap) <= day && day < (212 + leap)) {
+		return 6;
+	}
+	if ((212 + leap) <= day && day < (243 + leap)) {
+		return 7;
+	}
+	if ((243 + leap) <= day && day < (273 + leap)) {
+		return 8;
+	}
+	if ((273 + leap) <= day && day < (304 + leap)) {
+		return 9;
+	}
+	if ((304 + leap) <= day && day < (334 + leap)) {
+		return 10;
+	}
+	if ((334 + leap) <= day && day < (365 + leap)) {
+		return 11;
+	}
+};
diff --git a/node_modules/es-abstract/5/SameValue.js b/node_modules/es-abstract/5/SameValue.js
new file mode 100644
index 0000000..b73939b
--- /dev/null
+++ b/node_modules/es-abstract/5/SameValue.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $isNaN = require('../helpers/isNaN');
+
+// http://262.ecma-international.org/5.1/#sec-9.12
+
+module.exports = function SameValue(x, y) {
+	if (x === y) { // 0 === -0, but they are not identical.
+		if (x === 0) { return 1 / x === 1 / y; }
+		return true;
+	}
+	return $isNaN(x) && $isNaN(y);
+};
diff --git a/node_modules/es-abstract/5/SecFromTime.js b/node_modules/es-abstract/5/SecFromTime.js
new file mode 100644
index 0000000..fc2e445
--- /dev/null
+++ b/node_modules/es-abstract/5/SecFromTime.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var floor = require('./floor');
+var modulo = require('./modulo');
+
+var timeConstants = require('../helpers/timeConstants');
+var msPerSecond = timeConstants.msPerSecond;
+var SecondsPerMinute = timeConstants.SecondsPerMinute;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function SecFromTime(t) {
+	return modulo(floor(t / msPerSecond), SecondsPerMinute);
+};
diff --git a/node_modules/es-abstract/5/StrictEqualityComparison.js b/node_modules/es-abstract/5/StrictEqualityComparison.js
new file mode 100644
index 0000000..f3435ba
--- /dev/null
+++ b/node_modules/es-abstract/5/StrictEqualityComparison.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var Type = require('./Type');
+
+// https://262.ecma-international.org/5.1/#sec-11.9.6
+
+module.exports = function StrictEqualityComparison(x, y) {
+	var xType = Type(x);
+	var yType = Type(y);
+	if (xType !== yType) {
+		return false;
+	}
+	if (xType === 'Undefined' || xType === 'Null') {
+		return true;
+	}
+	return x === y; // shortcut for steps 4-7
+};
diff --git a/node_modules/es-abstract/5/TimeClip.js b/node_modules/es-abstract/5/TimeClip.js
new file mode 100644
index 0000000..e416cab
--- /dev/null
+++ b/node_modules/es-abstract/5/TimeClip.js
@@ -0,0 +1,21 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+var $Number = GetIntrinsic('%Number%');
+
+var $isFinite = require('../helpers/isFinite');
+
+var abs = require('./abs');
+var ToNumber = require('./ToNumber');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.14
+
+module.exports = function TimeClip(time) {
+	if (!$isFinite(time) || abs(time) > 8.64e15) {
+		return NaN;
+	}
+	return $Number(new $Date(ToNumber(time)));
+};
+
diff --git a/node_modules/es-abstract/5/TimeFromYear.js b/node_modules/es-abstract/5/TimeFromYear.js
new file mode 100644
index 0000000..f3518a4
--- /dev/null
+++ b/node_modules/es-abstract/5/TimeFromYear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+var DayFromYear = require('./DayFromYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function TimeFromYear(y) {
+	return msPerDay * DayFromYear(y);
+};
diff --git a/node_modules/es-abstract/5/TimeWithinDay.js b/node_modules/es-abstract/5/TimeWithinDay.js
new file mode 100644
index 0000000..2bba833
--- /dev/null
+++ b/node_modules/es-abstract/5/TimeWithinDay.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerDay = require('../helpers/timeConstants').msPerDay;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.2
+
+module.exports = function TimeWithinDay(t) {
+	return modulo(t, msPerDay);
+};
+
diff --git a/node_modules/es-abstract/5/ToBoolean.js b/node_modules/es-abstract/5/ToBoolean.js
new file mode 100644
index 0000000..466404b
--- /dev/null
+++ b/node_modules/es-abstract/5/ToBoolean.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.2
+
+module.exports = function ToBoolean(value) { return !!value; };
diff --git a/node_modules/es-abstract/5/ToInt32.js b/node_modules/es-abstract/5/ToInt32.js
new file mode 100644
index 0000000..b879ccc
--- /dev/null
+++ b/node_modules/es-abstract/5/ToInt32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.5
+
+module.exports = function ToInt32(x) {
+	return ToNumber(x) >> 0;
+};
diff --git a/node_modules/es-abstract/5/ToInteger.js b/node_modules/es-abstract/5/ToInteger.js
new file mode 100644
index 0000000..d1c9b61
--- /dev/null
+++ b/node_modules/es-abstract/5/ToInteger.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.4
+
+module.exports = function ToInteger(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number)) { return 0; }
+	if (number === 0 || !$isFinite(number)) { return number; }
+	return $sign(number) * floor(abs(number));
+};
diff --git a/node_modules/es-abstract/5/ToNumber.js b/node_modules/es-abstract/5/ToNumber.js
new file mode 100644
index 0000000..2bfc74c
--- /dev/null
+++ b/node_modules/es-abstract/5/ToNumber.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var ToPrimitive = require('./ToPrimitive');
+
+// http://262.ecma-international.org/5.1/#sec-9.3
+
+module.exports = function ToNumber(value) {
+	var prim = ToPrimitive(value, Number);
+	if (typeof prim !== 'string') {
+		return +prim; // eslint-disable-line no-implicit-coercion
+	}
+
+	// eslint-disable-next-line no-control-regex
+	var trimmed = prim.replace(/^[ \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u0085]+|[ \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u0085]+$/g, '');
+	if ((/^0[ob]|^[+-]0x/).test(trimmed)) {
+		return NaN;
+	}
+
+	return +trimmed; // eslint-disable-line no-implicit-coercion
+};
diff --git a/node_modules/es-abstract/5/ToObject.js b/node_modules/es-abstract/5/ToObject.js
new file mode 100644
index 0000000..816e537
--- /dev/null
+++ b/node_modules/es-abstract/5/ToObject.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+
+var CheckObjectCoercible = require('./CheckObjectCoercible');
+
+// http://262.ecma-international.org/5.1/#sec-9.9
+
+module.exports = function ToObject(value) {
+	CheckObjectCoercible(value);
+	return $Object(value);
+};
diff --git a/node_modules/es-abstract/5/ToPrimitive.js b/node_modules/es-abstract/5/ToPrimitive.js
new file mode 100644
index 0000000..56dfdb0
--- /dev/null
+++ b/node_modules/es-abstract/5/ToPrimitive.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// http://262.ecma-international.org/5.1/#sec-9.1
+
+module.exports = require('es-to-primitive/es5');
diff --git a/node_modules/es-abstract/5/ToPropertyDescriptor.js b/node_modules/es-abstract/5/ToPropertyDescriptor.js
new file mode 100644
index 0000000..53db874
--- /dev/null
+++ b/node_modules/es-abstract/5/ToPropertyDescriptor.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var has = require('has');
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+
+var Type = require('./Type');
+var ToBoolean = require('./ToBoolean');
+var IsCallable = require('./IsCallable');
+
+// https://262.ecma-international.org/5.1/#sec-8.10.5
+
+module.exports = function ToPropertyDescriptor(Obj) {
+	if (Type(Obj) !== 'Object') {
+		throw new $TypeError('ToPropertyDescriptor requires an object');
+	}
+
+	var desc = {};
+	if (has(Obj, 'enumerable')) {
+		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
+	}
+	if (has(Obj, 'configurable')) {
+		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
+	}
+	if (has(Obj, 'value')) {
+		desc['[[Value]]'] = Obj.value;
+	}
+	if (has(Obj, 'writable')) {
+		desc['[[Writable]]'] = ToBoolean(Obj.writable);
+	}
+	if (has(Obj, 'get')) {
+		var getter = Obj.get;
+		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
+			throw new $TypeError('getter must be a function');
+		}
+		desc['[[Get]]'] = getter;
+	}
+	if (has(Obj, 'set')) {
+		var setter = Obj.set;
+		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
+			throw new $TypeError('setter must be a function');
+		}
+		desc['[[Set]]'] = setter;
+	}
+
+	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+	}
+	return desc;
+};
diff --git a/node_modules/es-abstract/5/ToString.js b/node_modules/es-abstract/5/ToString.js
new file mode 100644
index 0000000..c39faeb
--- /dev/null
+++ b/node_modules/es-abstract/5/ToString.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $String = GetIntrinsic('%String%');
+
+// http://262.ecma-international.org/5.1/#sec-9.8
+
+module.exports = function ToString(value) {
+	return $String(value);
+};
+
diff --git a/node_modules/es-abstract/5/ToUint16.js b/node_modules/es-abstract/5/ToUint16.js
new file mode 100644
index 0000000..633ca84
--- /dev/null
+++ b/node_modules/es-abstract/5/ToUint16.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var abs = require('./abs');
+var floor = require('./floor');
+var modulo = require('./modulo');
+var ToNumber = require('./ToNumber');
+
+var $isNaN = require('../helpers/isNaN');
+var $isFinite = require('../helpers/isFinite');
+var $sign = require('../helpers/sign');
+
+// http://262.ecma-international.org/5.1/#sec-9.7
+
+module.exports = function ToUint16(value) {
+	var number = ToNumber(value);
+	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+	var posInt = $sign(number) * floor(abs(number));
+	return modulo(posInt, 0x10000);
+};
diff --git a/node_modules/es-abstract/5/ToUint32.js b/node_modules/es-abstract/5/ToUint32.js
new file mode 100644
index 0000000..2a8e9dd
--- /dev/null
+++ b/node_modules/es-abstract/5/ToUint32.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var ToNumber = require('./ToNumber');
+
+// http://262.ecma-international.org/5.1/#sec-9.6
+
+module.exports = function ToUint32(x) {
+	return ToNumber(x) >>> 0;
+};
diff --git a/node_modules/es-abstract/5/Type.js b/node_modules/es-abstract/5/Type.js
new file mode 100644
index 0000000..f023030
--- /dev/null
+++ b/node_modules/es-abstract/5/Type.js
@@ -0,0 +1,24 @@
+'use strict';
+
+// https://262.ecma-international.org/5.1/#sec-8
+
+module.exports = function Type(x) {
+	if (x === null) {
+		return 'Null';
+	}
+	if (typeof x === 'undefined') {
+		return 'Undefined';
+	}
+	if (typeof x === 'function' || typeof x === 'object') {
+		return 'Object';
+	}
+	if (typeof x === 'number') {
+		return 'Number';
+	}
+	if (typeof x === 'boolean') {
+		return 'Boolean';
+	}
+	if (typeof x === 'string') {
+		return 'String';
+	}
+};
diff --git a/node_modules/es-abstract/5/WeekDay.js b/node_modules/es-abstract/5/WeekDay.js
new file mode 100644
index 0000000..17cf94c
--- /dev/null
+++ b/node_modules/es-abstract/5/WeekDay.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var Day = require('./Day');
+var modulo = require('./modulo');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.6
+
+module.exports = function WeekDay(t) {
+	return modulo(Day(t) + 4, 7);
+};
diff --git a/node_modules/es-abstract/5/YearFromTime.js b/node_modules/es-abstract/5/YearFromTime.js
new file mode 100644
index 0000000..be06ecb
--- /dev/null
+++ b/node_modules/es-abstract/5/YearFromTime.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Date = GetIntrinsic('%Date%');
+
+var callBound = require('call-bind/callBound');
+
+var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.3
+
+module.exports = function YearFromTime(t) {
+	// largest y such that this.TimeFromYear(y) <= t
+	return $getUTCFullYear(new $Date(t));
+};
diff --git a/node_modules/es-abstract/5/abs.js b/node_modules/es-abstract/5/abs.js
new file mode 100644
index 0000000..8bc4543
--- /dev/null
+++ b/node_modules/es-abstract/5/abs.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $abs = GetIntrinsic('%Math.abs%');
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function abs(x) {
+	return $abs(x);
+};
diff --git a/node_modules/es-abstract/5/floor.js b/node_modules/es-abstract/5/floor.js
new file mode 100644
index 0000000..8439df0
--- /dev/null
+++ b/node_modules/es-abstract/5/floor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+// var modulo = require('./modulo');
+var $floor = Math.floor;
+
+// http://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function floor(x) {
+	// return x - modulo(x, 1);
+	return $floor(x);
+};
diff --git a/node_modules/es-abstract/5/modulo.js b/node_modules/es-abstract/5/modulo.js
new file mode 100644
index 0000000..b94bb52
--- /dev/null
+++ b/node_modules/es-abstract/5/modulo.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var mod = require('../helpers/mod');
+
+// https://262.ecma-international.org/5.1/#sec-5.2
+
+module.exports = function modulo(x, y) {
+	return mod(x, y);
+};
diff --git a/node_modules/es-abstract/5/msFromTime.js b/node_modules/es-abstract/5/msFromTime.js
new file mode 100644
index 0000000..a6bae76
--- /dev/null
+++ b/node_modules/es-abstract/5/msFromTime.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var modulo = require('./modulo');
+
+var msPerSecond = require('../helpers/timeConstants').msPerSecond;
+
+// https://262.ecma-international.org/5.1/#sec-15.9.1.10
+
+module.exports = function msFromTime(t) {
+	return modulo(t, msPerSecond);
+};
diff --git a/node_modules/es-abstract/CHANGELOG.md b/node_modules/es-abstract/CHANGELOG.md
new file mode 100644
index 0000000..1aaee88
--- /dev/null
+++ b/node_modules/es-abstract/CHANGELOG.md
@@ -0,0 +1,465 @@
+1.18.0 / 2021-03-03
+=================
+  * [New] add `ES2020`, and a number of additional AOs: See the changelog entries for the prereleases for more information:
+     - [next.3](./CHANGELOG.md#1180-next3--2021-03-01)
+     - [next.2](./CHANGELOG.md#1180-next2--2021-01-17)
+     - [next.1](./CHANGELOG.md#1180-next1--2020-09-30)
+     - [next.0](./CHANGELOG.md#1180-next0--2020-08-14)
+  * [Refactor] `ES5+`: `Abstract Relational Comparison`: increase coverage
+  * [Tests] increase coverage
+  * [Tests] do not run coverage on node 0.6
+
+1.18.0-next.3 / 2021-03-01
+=================
+  * [New] `ES2015`: add `StringGetIndexProperty`
+  * [New] `ES2015+`: add `RegExpCreate`, `SplitMatch`, `StringCreate`
+  * [New] `ES2016-ES2019`: add `UTF16Decode`
+  * [New] `ES2020+`: add `NumberToBigInt`
+  * [New] `ES2020+: add `BigInt::`/`Number::` methods:
+  * [Fix] `ES5`: `ToNumber`: properly refuse to parse ES6+ forms
+  * [Fix] `ES2015+`: `Invoke`: optional argumentsList must be a List of arguments, not a list of arguments
+  * [Fix] `ES2016+`: `UTF16Encoding`: properly return a string code point instead of a numeric code point
+  * [Fix] `ES2020`: `NumberBitwiseOp`: assert that x and y are Numbers
+  * [readme] remove travis/testling badge, fix repo URLs
+  * [meta] `ES2015`: add missing `CreateArrayIterator` AO
+  * [meta] `ES2015-ES2017`: add missing `DaylightSavingTA` AO
+  * [meta] rerun `npm run spackle` to update URLs left after 11d8c8df11c0d15d094a6035afed662e22b440ef
+  * [meta] update ecma URLs
+  * [meta] unignore 2020 operations list
+  * [meta] update operations scripts linting
+  * [meta] refactor getOps script to fetch all years at once
+  * [meta] refactor operations script to keep years in one place
+  * [meta] fix ES2015 spec URL
+  * [Deps] update `has-symbols`, `string.prototype.trimend`, `string.prototype.trimstart`, `get-intrinsic`, `is-callable`, `is-regex`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `array.prototype.indexof`, `aud`, `es-value-fixtures`, `object.fromentries`, `tape`, `diff`
+  * [operations] detect ES2020+ style `T::` numeric operations
+  * [Tests] increase coverage
+  * [Tests] `BigInt(1e17)` throws on node v10.4-v10.6
+  * [Tests] improve coverage on `Number::` methods
+  * [Tests] `tape` v5 `.equal` now uses strict equality, so no more need for `is()`
+  * [Tests] improve BigInt:: and Number:: coverage
+  * [Tests] actually run all the helpers tests
+  * [Tests] ensure "expected missing" ops list is accurate
+  * [Tests] abstract away per-operation skips
+  * [Tests] skip BigInt:: tests on envs without BigInts
+  * [Tests] use `es-value-fixtures`
+  * [actions] update workflows
+
+1.18.0-next.2 / 2021-01-17
+=================
+  * [New] `helpers`: add `isByteValue`, `isCodePoint`, `some`
+  * [Fix] `ES2018+`: fix `GetSubstitution` with named captures
+  * [Fix] `ES2020`: `GetIterator`: add omitted `hint` parameter
+  * [Fix] `ES2018`/`ES2019`: `SetFunctionLength`: Infinities should throw
+  * [Fix] `ES2020`: `ToIndex` uses `SameValue` instead of `SameValueZero`
+  * [Fix] `ES2020`: `CopyDataProperties` uses `CreateDataPropertyOrThrow` instead of `CreateDataProperty`
+  * [Refactor] use extracted `call-bind` instead of local helpers
+  * [Refactor] use extracted `get-intrinsic` package
+  * [Deps] update `call-bind`, `get-intrinsic`, `is-callable`, `is-negative-zero`, `is-regex`, `object-inspect`, `object.assign`, `string.prototype.trimend`, `string.prototype.trimstart`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `array.prototype.indexof`, `aud`, `diff`, `functions-have-names`, `has-bigints`, `has-strict-mode`, `object-is`, `object.fromentries`, `tape`
+  * [actions] switch Automatic Rebase workflow to `pull_request_target` event
+  * [actions] add "Allow Edits" workflow
+  * [meta] pin cheerio to v1.0.0-rc.3, to fix getOps
+  * [meta] make all URLs consistent, and point to spec artifacts
+  * [meta] refactor `deltas` script; update eslint on operations scripts
+  * [meta] do not publish .github dir (#123)
+  * [Tests] add `v.notNonNegativeIntegers`, `v.nonConstructorFunctions`
+  * [Tests] migrate tests to Github Actions
+  * [Tests] run coverage on all tests
+  * [Tests] add `npm run test:ses`
+
+1.18.0-next.1 / 2020-09-30
+=================
+  * [Fix] `ES2020`: `ToInteger`: `-0` should always be normalized to `+0` (#116)
+  * [patch] `GetIntrinsic`: Adapt to override-mistake-fix pattern (#115)
+  * [Fix] `callBind`: ensure compatibility with SES
+  * [Deps] update `is-callable`, `object.assign`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
+  * [eslint] fix warning
+  * [Tests] temporarily allow SES tests to fail (#115)
+  * [Tests] ses-compat - initialize module after ses lockdown (#113)
+  * [Tests] [Refactor] use defineProperty helper rather than assignment
+  * [Tests] [Refactor] clean up defineProperty test helper
+
+1.18.0-next.0 / 2020-08-14
+=================
+  * [New] add `ES2020`
+  * [New] `GetIntrinsic`: add `%AggregateError%`, `%FinalizationRegistry%`, and `%WeakRef%`
+  * [New] `ES5`+: add `abs`, `floor`; use `modulo` consistently
+  * [New] `GetIntrinsic`: Cache accessed intrinsics (#98)
+  * [New] `GetIntrinsic`: Add ES201x function intrinsics (#97)
+  * [New] `ES2015`+: add `QuoteJSONString`, `OrdinaryCreateFromConstructor`
+  * [New] `ES2017`+: add `StringGetOwnProperty`
+  * [New] `ES2016`+: add `UTF16Encoding`
+  * [New] `ES2018`+: add `SetFunctionLength`, `UnicodeEscape`
+  * [New] add `isLeadingSurrogate`/`isTrailingSurrogate` helpers
+  * [Fix] `ES5`+: `ToPropertyDescriptor`: use intrinsic TypeError
+  * [Fix] `ES2018+`: `CopyDataProperties`/`NumberToString`: use intrinsic TypeError
+  * [Deps] update `is-regex`, `object-inspect`
+  * [Dev Deps] update `eslint`
+
+1.17.7 / 2020-09-30
+=================
+  * [Fix] `ES2020`: `ToInteger`: `-0` should always be normalized to `+0` (#116)
+  * [patch] `GetIntrinsic`: Adapt to override-mistake-fix pattern (#115)
+  * [Fix] `callBind`: ensure compatibility with SES
+  * [Deps] update `is-callable`, `is-regex`, `object-inspect`, `object.assign`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
+
+1.17.6 / 2020-06-13
+=================
+  * [Fix] `helpers/getSymbolDescription`: use the global Symbol registry when available (#92)
+  * [Fix] `ES2015+`: `IsConstructor`: when `Reflect.construct` is available, be spec-accurate (#93)
+  * [Fix] `ES2015+`: `Set`: Always return boolean value (#101)
+  * [Fix] `ES2015+`: `Set`: ensure exceptions are thrown in IE 9 when requested
+  * [Fix] Use `Reflect.apply(…)` if available (#99)
+  * [Fix] `helpers/floor`: module-cache `Math.floor`
+  * [Fix] `helpers/getSymbolDescription`: Prefer bound `description` getter when present
+  * [Fix] `2016`: Use `getIteratorMethod` in `IterableToArrayLike` (#94)
+  * [Fix] `helpers/OwnPropertyKeys`: Use `Reflect.ownKeys(…)` if available (#91)
+  * [Fix] `2018+`: Fix `CopyDataProperties` depending on `this` (#95)
+  * [meta] mark spackled files as autogenerated
+  * [meta] `Type`: fix spec URL
+  * [meta] `ES2015`: complete ops list
+  * [Deps] update `is‑callable`, `is‑regex`
+  * [Deps] switch from `string.prototype.trimleft`/`string.prototype.trimright` to `string.prototype.trimstart`/`string.prototype.trimend`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `in-publish`, `object-is`, `tape`; add `aud`
+  * [eslint] `helpers/isPropertyDescriptor`: fix indentation
+  * [Tests] `helpers/getSymbolDescription`: add test cases; some envs have `Symbol.for` but can not infer a name (#92)
+  * [Tests] try out CodeQL analysis
+  * [Tests] reformat expected missing ops
+  * [Tests] Run tests with `undefined` this (#96)
+
+1.17.5 / 2020-03-22
+=================
+  * [Fix] `CreateDataProperty`: update an existing property
+  * [Fix] run missing spackle from cd7504701879ddea0f5981e99cbcf93bfea9171d
+  * [Dev Deps] update `make-arrow-function`, `tape`, `@ljharb/eslint-config`
+
+1.17.4 / 2020-01-21
+=================
+  * [Fix] `2015+`: add code to handle IE 8’s problems
+  * [Tests] fix tests for IE 8
+
+1.17.3 / 2020-01-19
+=================
+  * [Fix] `ObjectCreate` `2015+`: Fall back to `__proto__` and normal `new` in older browsers
+  * [Fix] `GetIntrinsic`: ensure the `allowMissing` property actually works on dotted intrinsics
+
+1.17.2 / 2020-01-14
+=================
+  * [Fix] `helpers/OwnPropertyKeys`: include non-enumerables too
+
+1.17.1 / 2020-01-14
+=================
+  * [Refactor] add `OwnPropertyKeys` helper, use it in `CopyDataProperties`
+  * [Refactor] `IteratorClose`: remove useless assignment
+  * [Dev Deps] update `eslint`, `tape`, `diff`
+
+1.17.0 / 2019-12-20
+=================
+  * [New] Split up each operation into its own file (prereleased)
+  * [Fix] `GetIntrinsic`: IE 8 has a broken `Object.getOwnPropertyDescriptor`
+  * [Fix] `object.assign` is a runtime dep (prereleased)
+  * [Refactor] `GetIntrinsic`: remove the internal property salts, since % already handles that
+  * [Refactor] `GetIntrinsic`: further simplification
+  * [Deps] update `is-callable`, `string.prototype.trimleft`, `string.prototype.trimright`, `is-regex`
+  * [Dev Deps] update `@ljharb/eslint-config`, `object-is`, `object.fromentries`, `tape`
+  * [Tests] add `.eslintignore`
+  * [meta] remove unused Makefile and associated utils
+  * [meta] only run spackle script in publish (#78) (prereleased)
+
+1.17.0-next.1 / 2019-12-11
+=================
+  * [Fix] `object.assign` is a runtime dep
+  * [meta] only run spackle script in publish (#78)
+
+1.17.0-next.0 / 2019-12-11
+=================
+  * [New] Split up each operation into its own file
+
+1.16.3 / 2019-12-04
+=================
+  * [Fix] `GetIntrinsic`: when given a path to a getter, return the actual getter
+  * [Dev Deps] update `eslint`
+
+1.16.2 / 2019-11-24
+=================
+  * [Fix] IE 6-7 lack JSON
+  * [Fix] IE 6-8 strings can’t use array slice, they need string slice
+  * [Dev Deps] update `eslint`
+
+1.16.1 / 2019-11-24
+=================
+  * [Fix] `GetIntrinsics`: turns out IE 8 throws when `Object.getOwnPropertyDescriptor(arguments);`, and does not throw on `callee` anyways
+  * [Deps] update `es-to-primitive`, `has-symbols`, `object-inspect`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`
+  * [meta] re-include year files inside `operations`
+  * [meta] add `funding` field
+  * [actions] add Automatic Rebase github action
+  * [Tests] use shared travis-ci config
+  * [Tests] disable `check-coverage`, and let codecov do it
+
+1.16.0 / 2019-10-18
+=================
+  * [New] `ES2015+`: add `SetFunctionName`
+  * [New] `ES2015+`: add `GetPrototypeFromConstructor`, with caveats
+  * [New] `ES2015+`: add `CreateListFromArrayLike`
+  * [New] `ES2016+`: add `OrdinarySetPrototypeOf`
+  * [New] `ES2016+`: add `OrdinaryGetPrototypeOf`
+  * [New] add `getSymbolDescription` and `getInferredName` helpers
+  * [Fix] `GetIterator`: add fallback for pre-Symbol environments, tests
+  * [Dev Deps] update `object.fromentries`
+  * [Tests] add `node` `v12.2`
+
+1.15.0 / 2019-10-02
+=================
+  * [New] `ES2018`+: add `DateString`, `TimeString`
+  * [New] `ES2015`+: add `ToDateString`
+  * [New] `ES5`+: add `msFromTime`, `SecFromTime`, `MinFromTime`, `HourFromTime`, `TimeWithinDay`, `Day`, `DayFromYear`, `TimeFromYear`, `YearFromTime`, `WeekDay`, `DaysInYear`, `InLeapYear`, `DayWithinYear`, `MonthFromTime`, `DateFromTime`, `MakeDay`, `MakeDate`, `MakeTime`, `TimeClip`, `modulo`
+  * [New] add `regexTester` helper
+  * [New] add `callBound` helper
+  * [New] add ES2020’s intrinsic dot notation
+  * [New] add `isPrefixOf` helper
+  * [New] add `maxSafeInteger` helper
+  * [Deps] update `string.prototype.trimleft`, `string.prototype.trimright`
+  * [Dev Deps] update `eslint`
+  * [Tests] on `node` `v12.11`
+  * [meta] npmignore operations scripts; add "deltas"
+
+1.14.2 / 2019-09-08
+=================
+  * [Fix] `ES2016`: `IterableToArrayLike`: add proper fallback for strings, pre-Symbols
+  * [Tests] on `node` `v12.10`
+
+1.14.1 / 2019-09-03
+=================
+  * [meta] republish with some extra files removed
+
+1.14.0 / 2019-09-02
+=================
+  * [New] add ES2019
+  * [New] `ES2017+`: add `IterableToList`
+  * [New] `ES2016`: add `IterableToArrayLike`
+  * [New] `ES2015+`: add `ArrayCreate`, `ArraySetLength`, `OrdinaryDefineOwnProperty`, `OrdinaryGetOwnProperty`, `OrdinaryHasProperty`, `CreateHTML`, `GetOwnPropertyKeys`, `InstanceofOperator`, `SymbolDescriptiveString`, `GetSubstitution`, `ValidateAndApplyPropertyDescriptor`, `IsPromise`, `OrdinaryHasInstance`, `TestIntegrityLevel`, `SetIntegrityLevel`
+  * [New] add `callBind` helper, and use it
+  * [New] add helpers: `isPropertyDescriptor`, `every`
+  * [New] ES5+: add `Abstract Relational Comparison`
+  * [New] ES5+: add `Abstract Equality Comparison`, `Strict Equality Comparison`
+  * [Fix] `ES2015+`: `GetIterator`: only require native Symbols when `method` is omitted
+  * [Fix] `ES2015`: `Call`: error message now properly displays Symbols using `object-inspect`
+  * [Fix] `ES2015+`: `ValidateAndApplyPropertyDescriptor`: use ES2017 logic to bypass spec bugs
+  * [Fix] `ES2015+`: `CreateDataProperty`, `DefinePropertyOrThrow`, `ValidateAndApplyPropertyDescriptor`: add fallbacks for ES3
+  * [Fix] `ES2015+`: `FromPropertyDescriptor`: no longer requires a fully complete Property Descriptor
+  * [Fix] `ES5`: `IsPropertyDescriptor`: call into `IsDataDescriptor` and `IsAccessorDescriptor`
+  * [Refactor] use `has-symbols` for Symbol detection
+  * [Fix] `helpers/assertRecord`: remove `console.log`
+  * [Deps] update `object-keys`
+  * [readme] add security note
+  * [meta] change http URLs to https
+  * [meta] linter cleanup
+  * [meta] fix getOps script
+  * [meta] add FUNDING.yml
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `semver`, `replace`, `cheerio`, `tape`
+  * [Tests] up to `node` `v12.9`, `v11.15`, `v10.16`, `v8.16`, `v6.17`
+  * [Tests] temporarily allow node 0.6 to fail; segfaulting in travis
+  * [Tests] use the values helper more in es5 tests
+  * [Tests] fix linting to apply to all files
+  * [Tests] run `npx aud` only on prod deps
+  * [Tests] add v.descriptors helpers
+  * [Tests] use `npx aud` instead of `npm audit` with hoops
+  * [Tests] use `eclint` instead of `editorconfig-tools`
+  * [Tests] some intrinsic cleanup
+  * [Tests] migrate es5 tests to use values helper
+  * [Tests] add some missing ES2015 ops
+
+1.13.0 / 2019-01-02
+=================
+  * [New] add ES2018
+  * [New] add ES2015/ES2016: EnumerableOwnNames; ES2017: EnumerableOwnProperties
+  * [New] `ES2015+`: add `thisBooleanValue`, `thisNumberValue`, `thisStringValue`, `thisTimeValue`
+  * [New] `ES2015+`: add `DefinePropertyOrThrow`, `DeletePropertyOrThrow`, `CreateMethodProperty`
+  * [New] add `assertRecord` helper
+  * [Deps] update `is-callable`, `has`, `object-keys`, `es-to-primitive`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `semver`, `safe-publish-latest`, `replace`
+  * [Tests] use `npm audit` instead of `nsp`
+  * [Tests] remove `jscs`
+  * [Tests] up to `node` `v11.6`, `v10.15`, `v8.15`, `v6.16`
+  * [Tests] move descriptor factories to `values` helper
+  * [Tests] add `getOps` to programmatically fetch abstract operation names
+
+1.12.0 / 2018-05-31
+=================
+  * [New] add `GetIntrinsic` entry point
+  * [New] `ES2015`+: add `ObjectCreate`
+  * [Robustness]: `ES2015+`: ensure `Math.{abs,floor}` and `Function.call` are cached
+
+1.11.0 / 2018-03-21
+=================
+  * [New] `ES2015+`: add iterator abstract ops
+  * [Dev Deps] update `eslint`, `nsp`, `object.assign`, `semver`, `tape`
+  * [Tests] up to `node` `v9.8`, `v8.10`, `v6.13`
+
+1.10.0 / 2017-11-24
+=================
+  * [New] ES2015+: `AdvanceStringIndex`
+  * [Dev Deps] update `eslint`, `nsp`
+  * [Tests] require node 0.6 to pass again
+  * [Tests] up to `node` `v9.2`, `v8.9`, `v6.12`; use `nvm install-latest-npm`; pin included builds to LTS
+
+1.9.0 / 2017-09-30
+=================
+  * [New] `es2015+`: add `ArraySpeciesCreate`
+  * [New] ES2015+: add `CreateDataProperty` and `CreateDataPropertyOrThrow`
+  * [Tests] consolidate duplicated tests
+  * [Tests] increase coverage
+  * [Dev Deps] update `nsp`, `eslint`
+
+1.8.2 / 2017-09-03
+=================
+  * [Fix] `es2015`+: `ToNumber`: provide the proper hint for Date objects (#27)
+  * [Dev Deps] update `eslint`
+
+1.8.1 / 2017-08-30
+=================
+  * [Fix] ES2015+: `ToPropertyKey`: should return a symbol for Symbols (#26)
+  * [Deps] update `function-bind`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
+  * [Docs] github broke markdown parsing
+
+1.8.0 / 2017-08-04
+=================
+  * [New] add ES2017
+  * [New] move es6+ to es2015+; leave es6/es7 as aliases
+  * [New] ES5+: add `IsPropertyDescriptor`, `IsAccessorDescriptor`, `IsDataDescriptor`, `IsGenericDescriptor`, `FromPropertyDescriptor`, `ToPropertyDescriptor`
+  * [New] ES2015+: add `CompletePropertyDescriptor`, `Set`, `HasOwnProperty`, `HasProperty`, `IsConcatSpreadable`, `Invoke`, `CreateIterResultObject`, `RegExpExec`
+  * [Fix] es7/es2016: do not mutate ES6
+  * [Fix] assign helper only supports one source
+  * [Deps] update `is-regex`
+  * [Dev Deps] update `nsp`, `eslint`, `@ljharb/eslint-config`
+  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `nsp`, `semver`, `tape`
+  * [Tests] add tests for missing and excess operations
+  * [Tests] add codecov for coverage
+  * [Tests] up to `node` `v8.2`, `v7.10`, `v6.11`, `v4.8`; newer npm breaks on older node
+  * [Tests] use same lists of value types across tests; ensure tests are the same when ops are the same
+  * [Tests] ES2015: add ToNumber symbol tests
+  * [Tests] switch to `nyc` for code coverage
+  * [Tests] make IsRegExp tests consistent across editions
+
+1.7.0 / 2017-01-22
+=================
+  * [New] ES6: Add `GetMethod` (#16)
+  * [New] ES6: Add `GetV` (#16)
+  * [New] ES6: Add `Get` (#17)
+  * [Tests] up to `node` `v7.4`, `v6.9`, `v4.6`; improve test matrix
+  * [Dev Deps] update `tape`, `nsp`, `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`
+
+1.6.1 / 2016-08-21
+=================
+  * [Fix] ES6: IsConstructor should return true for `class` constructors.
+
+1.6.0 / 2016-08-20
+=================
+  * [New] ES5 / ES6: add `Type`
+  * [New] ES6: `SpeciesConstructor`
+  * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`; add `safe-publish-latest`
+  * [Tests] up to `node` `v6.4`, `v5.12`, `v4.5`
+
+1.5.1 / 2016-05-30
+=================
+  * [Fix] `ES.IsRegExp`: actually look up `Symbol.match` on the argument
+  * [Refactor] create `isNaN` helper
+  * [Deps] update `is-callable`, `function-bind`
+  * [Deps] update `es-to-primitive`, fix ES5 tests
+  * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`, `nsp`
+  * [Tests] up to `node` `v6.2`, `v5.11`, `v4.4`
+  * [Tests] use pretest/posttest for linting/security
+
+1.5.0 / 2015-12-27
+=================
+  * [New] adds `Symbol.toPrimitive` support via `es-to-primitive`
+  * [Deps] update `is-callable`, `es-to-primitive`
+  * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`, `tape`
+  * [Tests] up to `node` `v5.3`
+
+1.4.3 / 2015-11-04
+=================
+  * [Fix] `ES6.ToNumber`: should give `NaN` for explicitly signed hex strings (#4)
+  * [Refactor] `ES6.ToNumber`: No need to double-trim
+  * [Refactor] group tests better
+  * [Tests] should still pass on `node` `v0.8`
+
+1.4.2 / 2015-11-02
+=================
+  * [Fix] ensure `ES.ToNumber` trims whitespace, and does not trim non-whitespace (#3)
+
+1.4.1 / 2015-10-31
+=================
+  * [Fix] ensure only 0-1 are valid binary and 0-7 are valid octal digits (#2)
+  * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
+  * [Tests] on `node` `v5.0`
+  * [Tests] fix npm upgrades for older node versions
+  * package.json: use object form of "authors", add "contributors"
+
+1.4.0 / 2015-09-26
+=================
+  * [Deps] update `is-callable`
+  * [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config`
+  * [Tests] on `node` `v4.2`
+  * [New] Add `SameValueNonNumber` to ES7
+
+1.3.2 / 2015-09-26
+=================
+  * [Fix] Fix `ES6.IsRegExp` to properly handle `Symbol.match`, per spec.
+  * [Tests] up to `io.js` `v3.3`, `node` `v4.1`
+  * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`
+
+1.3.1 / 2015-08-15
+=================
+  * [Fix] Ensure that objects that `toString` to a binary or octal literal also convert properly
+
+1.3.0 / 2015-08-15
+=================
+  * [New] ES6’s ToNumber now supports binary and octal literals.
+  * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`
+  * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+  * [Tests] up to `io.js` `v3.0`
+
+1.2.2 / 2015-07-28
+=================
+  * [Fix] Both `ES5.CheckObjectCoercible` and `ES6.RequireObjectCoercible` return the value if they don't throw.
+  * [Tests] Test on latest `io.js` versions.
+  * [Dev Deps] Update `eslint`, `jscs`, `tape`, `semver`, `covert`, `nsp`
+
+1.2.1 / 2015-03-20
+=================
+  * Fix `isFinite` helper.
+
+1.2.0 / 2015-03-19
+=================
+  * Use `es-to-primitive` for ToPrimitive methods.
+  * Test on latest `io.js` versions; allow failures on all but 2 latest `node`/`io.js` versions.
+
+1.1.2 / 2015-03-20
+=================
+  * Fix isFinite helper.
+
+1.1.1 / 2015-03-19
+=================
+  * Fix isPrimitive check for functions
+  * Update `eslint`, `editorconfig-tools`, `semver`, `nsp`
+
+1.1.0 / 2015-02-17
+=================
+  * Add ES7 export (non-default).
+  * All grade A-supported `node`/`iojs` versions now ship with an `npm` that understands `^`.
+  * Test on `iojs-v1.2`.
+
+1.0.1 / 2015-01-30
+=================
+  * Use `is-callable` instead of an internal function.
+  * Update `tape`, `jscs`, `nsp`, `eslint`
+
+1.0.0 / 2015-01-10
+=================
+  * v1.0.0
diff --git a/node_modules/es-abstract/GetIntrinsic.js b/node_modules/es-abstract/GetIntrinsic.js
new file mode 100644
index 0000000..d7e67b4
--- /dev/null
+++ b/node_modules/es-abstract/GetIntrinsic.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// TODO: remove, semver-major
+
+module.exports = require('get-intrinsic');
diff --git a/node_modules/es-abstract/LICENSE b/node_modules/es-abstract/LICENSE
new file mode 100644
index 0000000..8c271c1
--- /dev/null
+++ b/node_modules/es-abstract/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (C) 2015 Jordan Harband
+
+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.
\ No newline at end of file
diff --git a/node_modules/es-abstract/README.md b/node_modules/es-abstract/README.md
new file mode 100644
index 0000000..79a118e
--- /dev/null
+++ b/node_modules/es-abstract/README.md
@@ -0,0 +1,41 @@
+# es-abstract <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+ECMAScript spec abstract operations.
+When different versions of the spec conflict, the default export will be the latest version of the abstract operation.
+All abstract operations will also be available under an `es5`/`es2015`/`es2016`/`es2017`/`es2018`/`es2019` entry point, and exported property, if you require a specific version.
+
+## Example
+
+```js
+var ES = require('es-abstract');
+var assert = require('assert');
+
+assert(ES.isCallable(function () {}));
+assert(!ES.isCallable(/a/g));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+## Security
+
+Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
+
+[package-url]: https://npmjs.org/package/es-abstract
+[npm-version-svg]: https://versionbadg.es/ljharb/es-abstract.svg
+[deps-svg]: https://david-dm.org/ljharb/es-abstract.svg
+[deps-url]: https://david-dm.org/ljharb/es-abstract
+[dev-deps-svg]: https://david-dm.org/ljharb/es-abstract/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/es-abstract#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/es-abstract.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/es-abstract.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/es-abstract.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=es-abstract
diff --git a/node_modules/es-abstract/es2015.js b/node_modules/es-abstract/es2015.js
new file mode 100644
index 0000000..79be967
--- /dev/null
+++ b/node_modules/es-abstract/es2015.js
@@ -0,0 +1,123 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://ecma-international.org/ecma-262/6.0/#sec-abstract-operations
+var ES6 = {
+	'Abstract Equality Comparison': require('./2015/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2015/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2015/StrictEqualityComparison'),
+	abs: require('./2015/abs'),
+	AdvanceStringIndex: require('./2015/AdvanceStringIndex'),
+	ArrayCreate: require('./2015/ArrayCreate'),
+	ArraySetLength: require('./2015/ArraySetLength'),
+	ArraySpeciesCreate: require('./2015/ArraySpeciesCreate'),
+	Call: require('./2015/Call'),
+	CanonicalNumericIndexString: require('./2015/CanonicalNumericIndexString'),
+	CompletePropertyDescriptor: require('./2015/CompletePropertyDescriptor'),
+	CreateDataProperty: require('./2015/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2015/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2015/CreateHTML'),
+	CreateIterResultObject: require('./2015/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2015/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2015/CreateMethodProperty'),
+	DateFromTime: require('./2015/DateFromTime'),
+	Day: require('./2015/Day'),
+	DayFromYear: require('./2015/DayFromYear'),
+	DaysInYear: require('./2015/DaysInYear'),
+	DayWithinYear: require('./2015/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2015/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2015/DeletePropertyOrThrow'),
+	EnumerableOwnNames: require('./2015/EnumerableOwnNames'),
+	floor: require('./2015/floor'),
+	FromPropertyDescriptor: require('./2015/FromPropertyDescriptor'),
+	Get: require('./2015/Get'),
+	GetIterator: require('./2015/GetIterator'),
+	GetMethod: require('./2015/GetMethod'),
+	GetOwnPropertyKeys: require('./2015/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2015/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2015/GetSubstitution'),
+	GetV: require('./2015/GetV'),
+	HasOwnProperty: require('./2015/HasOwnProperty'),
+	HasProperty: require('./2015/HasProperty'),
+	HourFromTime: require('./2015/HourFromTime'),
+	InLeapYear: require('./2015/InLeapYear'),
+	InstanceofOperator: require('./2015/InstanceofOperator'),
+	Invoke: require('./2015/Invoke'),
+	IsAccessorDescriptor: require('./2015/IsAccessorDescriptor'),
+	IsArray: require('./2015/IsArray'),
+	IsCallable: require('./2015/IsCallable'),
+	IsConcatSpreadable: require('./2015/IsConcatSpreadable'),
+	IsConstructor: require('./2015/IsConstructor'),
+	IsDataDescriptor: require('./2015/IsDataDescriptor'),
+	IsExtensible: require('./2015/IsExtensible'),
+	IsGenericDescriptor: require('./2015/IsGenericDescriptor'),
+	IsInteger: require('./2015/IsInteger'),
+	IsPromise: require('./2015/IsPromise'),
+	IsPropertyDescriptor: require('./2015/IsPropertyDescriptor'),
+	IsPropertyKey: require('./2015/IsPropertyKey'),
+	IsRegExp: require('./2015/IsRegExp'),
+	IteratorClose: require('./2015/IteratorClose'),
+	IteratorComplete: require('./2015/IteratorComplete'),
+	IteratorNext: require('./2015/IteratorNext'),
+	IteratorStep: require('./2015/IteratorStep'),
+	IteratorValue: require('./2015/IteratorValue'),
+	MakeDate: require('./2015/MakeDate'),
+	MakeDay: require('./2015/MakeDay'),
+	MakeTime: require('./2015/MakeTime'),
+	MinFromTime: require('./2015/MinFromTime'),
+	modulo: require('./2015/modulo'),
+	MonthFromTime: require('./2015/MonthFromTime'),
+	msFromTime: require('./2015/msFromTime'),
+	ObjectCreate: require('./2015/ObjectCreate'),
+	OrdinaryCreateFromConstructor: require('./2015/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2015/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2015/OrdinaryGetOwnProperty'),
+	OrdinaryHasInstance: require('./2015/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2015/OrdinaryHasProperty'),
+	QuoteJSONString: require('./2015/QuoteJSONString'),
+	RegExpCreate: require('./2015/RegExpCreate'),
+	RegExpExec: require('./2015/RegExpExec'),
+	RequireObjectCoercible: require('./2015/RequireObjectCoercible'),
+	SameValue: require('./2015/SameValue'),
+	SameValueZero: require('./2015/SameValueZero'),
+	SecFromTime: require('./2015/SecFromTime'),
+	Set: require('./2015/Set'),
+	SetFunctionName: require('./2015/SetFunctionName'),
+	SetIntegrityLevel: require('./2015/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2015/SpeciesConstructor'),
+	SplitMatch: require('./2015/SplitMatch'),
+	StringCreate: require('./2015/StringCreate'),
+	StringGetIndexProperty: require('./2015/StringGetIndexProperty'),
+	SymbolDescriptiveString: require('./2015/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2015/TestIntegrityLevel'),
+	thisBooleanValue: require('./2015/thisBooleanValue'),
+	thisNumberValue: require('./2015/thisNumberValue'),
+	thisStringValue: require('./2015/thisStringValue'),
+	thisTimeValue: require('./2015/thisTimeValue'),
+	TimeClip: require('./2015/TimeClip'),
+	TimeFromYear: require('./2015/TimeFromYear'),
+	TimeWithinDay: require('./2015/TimeWithinDay'),
+	ToBoolean: require('./2015/ToBoolean'),
+	ToDateString: require('./2015/ToDateString'),
+	ToInt16: require('./2015/ToInt16'),
+	ToInt32: require('./2015/ToInt32'),
+	ToInt8: require('./2015/ToInt8'),
+	ToInteger: require('./2015/ToInteger'),
+	ToLength: require('./2015/ToLength'),
+	ToNumber: require('./2015/ToNumber'),
+	ToObject: require('./2015/ToObject'),
+	ToPrimitive: require('./2015/ToPrimitive'),
+	ToPropertyDescriptor: require('./2015/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2015/ToPropertyKey'),
+	ToString: require('./2015/ToString'),
+	ToUint16: require('./2015/ToUint16'),
+	ToUint32: require('./2015/ToUint32'),
+	ToUint8: require('./2015/ToUint8'),
+	ToUint8Clamp: require('./2015/ToUint8Clamp'),
+	Type: require('./2015/Type'),
+	ValidateAndApplyPropertyDescriptor: require('./2015/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2015/WeekDay'),
+	YearFromTime: require('./2015/YearFromTime')
+};
+
+module.exports = ES6;
diff --git a/node_modules/es-abstract/es2016.js b/node_modules/es-abstract/es2016.js
new file mode 100644
index 0000000..6fbdb0c
--- /dev/null
+++ b/node_modules/es-abstract/es2016.js
@@ -0,0 +1,128 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://262.ecma-international.org/7.0/#sec-abstract-operations
+var ES2016 = {
+	'Abstract Equality Comparison': require('./2016/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2016/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2016/StrictEqualityComparison'),
+	abs: require('./2016/abs'),
+	AdvanceStringIndex: require('./2016/AdvanceStringIndex'),
+	ArrayCreate: require('./2016/ArrayCreate'),
+	ArraySetLength: require('./2016/ArraySetLength'),
+	ArraySpeciesCreate: require('./2016/ArraySpeciesCreate'),
+	Call: require('./2016/Call'),
+	CanonicalNumericIndexString: require('./2016/CanonicalNumericIndexString'),
+	CompletePropertyDescriptor: require('./2016/CompletePropertyDescriptor'),
+	CreateDataProperty: require('./2016/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2016/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2016/CreateHTML'),
+	CreateIterResultObject: require('./2016/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2016/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2016/CreateMethodProperty'),
+	DateFromTime: require('./2016/DateFromTime'),
+	Day: require('./2016/Day'),
+	DayFromYear: require('./2016/DayFromYear'),
+	DaysInYear: require('./2016/DaysInYear'),
+	DayWithinYear: require('./2016/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2016/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2016/DeletePropertyOrThrow'),
+	EnumerableOwnNames: require('./2016/EnumerableOwnNames'),
+	floor: require('./2016/floor'),
+	FromPropertyDescriptor: require('./2016/FromPropertyDescriptor'),
+	Get: require('./2016/Get'),
+	GetIterator: require('./2016/GetIterator'),
+	GetMethod: require('./2016/GetMethod'),
+	GetOwnPropertyKeys: require('./2016/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2016/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2016/GetSubstitution'),
+	GetV: require('./2016/GetV'),
+	HasOwnProperty: require('./2016/HasOwnProperty'),
+	HasProperty: require('./2016/HasProperty'),
+	HourFromTime: require('./2016/HourFromTime'),
+	InLeapYear: require('./2016/InLeapYear'),
+	InstanceofOperator: require('./2016/InstanceofOperator'),
+	Invoke: require('./2016/Invoke'),
+	IsAccessorDescriptor: require('./2016/IsAccessorDescriptor'),
+	IsArray: require('./2016/IsArray'),
+	IsCallable: require('./2016/IsCallable'),
+	IsConcatSpreadable: require('./2016/IsConcatSpreadable'),
+	IsConstructor: require('./2016/IsConstructor'),
+	IsDataDescriptor: require('./2016/IsDataDescriptor'),
+	IsExtensible: require('./2016/IsExtensible'),
+	IsGenericDescriptor: require('./2016/IsGenericDescriptor'),
+	IsInteger: require('./2016/IsInteger'),
+	IsPromise: require('./2016/IsPromise'),
+	IsPropertyDescriptor: require('./2016/IsPropertyDescriptor'),
+	IsPropertyKey: require('./2016/IsPropertyKey'),
+	IsRegExp: require('./2016/IsRegExp'),
+	IterableToArrayLike: require('./2016/IterableToArrayLike'),
+	IteratorClose: require('./2016/IteratorClose'),
+	IteratorComplete: require('./2016/IteratorComplete'),
+	IteratorNext: require('./2016/IteratorNext'),
+	IteratorStep: require('./2016/IteratorStep'),
+	IteratorValue: require('./2016/IteratorValue'),
+	MakeDate: require('./2016/MakeDate'),
+	MakeDay: require('./2016/MakeDay'),
+	MakeTime: require('./2016/MakeTime'),
+	MinFromTime: require('./2016/MinFromTime'),
+	modulo: require('./2016/modulo'),
+	MonthFromTime: require('./2016/MonthFromTime'),
+	msFromTime: require('./2016/msFromTime'),
+	ObjectCreate: require('./2016/ObjectCreate'),
+	OrdinaryCreateFromConstructor: require('./2016/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2016/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2016/OrdinaryGetOwnProperty'),
+	OrdinaryGetPrototypeOf: require('./2016/OrdinaryGetPrototypeOf'),
+	OrdinaryHasInstance: require('./2016/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2016/OrdinaryHasProperty'),
+	OrdinarySetPrototypeOf: require('./2016/OrdinarySetPrototypeOf'),
+	QuoteJSONString: require('./2016/QuoteJSONString'),
+	RegExpCreate: require('./2016/RegExpCreate'),
+	RegExpExec: require('./2016/RegExpExec'),
+	RequireObjectCoercible: require('./2016/RequireObjectCoercible'),
+	SameValue: require('./2016/SameValue'),
+	SameValueNonNumber: require('./2016/SameValueNonNumber'),
+	SameValueZero: require('./2016/SameValueZero'),
+	SecFromTime: require('./2016/SecFromTime'),
+	Set: require('./2016/Set'),
+	SetFunctionName: require('./2016/SetFunctionName'),
+	SetIntegrityLevel: require('./2016/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2016/SpeciesConstructor'),
+	SplitMatch: require('./2016/SplitMatch'),
+	StringCreate: require('./2016/StringCreate'),
+	SymbolDescriptiveString: require('./2016/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2016/TestIntegrityLevel'),
+	thisBooleanValue: require('./2016/thisBooleanValue'),
+	thisNumberValue: require('./2016/thisNumberValue'),
+	thisStringValue: require('./2016/thisStringValue'),
+	thisTimeValue: require('./2016/thisTimeValue'),
+	TimeClip: require('./2016/TimeClip'),
+	TimeFromYear: require('./2016/TimeFromYear'),
+	TimeWithinDay: require('./2016/TimeWithinDay'),
+	ToBoolean: require('./2016/ToBoolean'),
+	ToDateString: require('./2016/ToDateString'),
+	ToInt16: require('./2016/ToInt16'),
+	ToInt32: require('./2016/ToInt32'),
+	ToInt8: require('./2016/ToInt8'),
+	ToInteger: require('./2016/ToInteger'),
+	ToLength: require('./2016/ToLength'),
+	ToNumber: require('./2016/ToNumber'),
+	ToObject: require('./2016/ToObject'),
+	ToPrimitive: require('./2016/ToPrimitive'),
+	ToPropertyDescriptor: require('./2016/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2016/ToPropertyKey'),
+	ToString: require('./2016/ToString'),
+	ToUint16: require('./2016/ToUint16'),
+	ToUint32: require('./2016/ToUint32'),
+	ToUint8: require('./2016/ToUint8'),
+	ToUint8Clamp: require('./2016/ToUint8Clamp'),
+	Type: require('./2016/Type'),
+	UTF16Decode: require('./2016/UTF16Decode'),
+	UTF16Encoding: require('./2016/UTF16Encoding'),
+	ValidateAndApplyPropertyDescriptor: require('./2016/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2016/WeekDay'),
+	YearFromTime: require('./2016/YearFromTime')
+};
+
+module.exports = ES2016;
diff --git a/node_modules/es-abstract/es2017.js b/node_modules/es-abstract/es2017.js
new file mode 100644
index 0000000..3cf0c00
--- /dev/null
+++ b/node_modules/es-abstract/es2017.js
@@ -0,0 +1,130 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://262.ecma-international.org/8.0/#sec-abstract-operations
+var ES2017 = {
+	'Abstract Equality Comparison': require('./2017/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2017/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2017/StrictEqualityComparison'),
+	abs: require('./2017/abs'),
+	AdvanceStringIndex: require('./2017/AdvanceStringIndex'),
+	ArrayCreate: require('./2017/ArrayCreate'),
+	ArraySetLength: require('./2017/ArraySetLength'),
+	ArraySpeciesCreate: require('./2017/ArraySpeciesCreate'),
+	Call: require('./2017/Call'),
+	CanonicalNumericIndexString: require('./2017/CanonicalNumericIndexString'),
+	CompletePropertyDescriptor: require('./2017/CompletePropertyDescriptor'),
+	CreateDataProperty: require('./2017/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2017/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2017/CreateHTML'),
+	CreateIterResultObject: require('./2017/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2017/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2017/CreateMethodProperty'),
+	DateFromTime: require('./2017/DateFromTime'),
+	Day: require('./2017/Day'),
+	DayFromYear: require('./2017/DayFromYear'),
+	DaysInYear: require('./2017/DaysInYear'),
+	DayWithinYear: require('./2017/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2017/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2017/DeletePropertyOrThrow'),
+	EnumerableOwnProperties: require('./2017/EnumerableOwnProperties'),
+	floor: require('./2017/floor'),
+	FromPropertyDescriptor: require('./2017/FromPropertyDescriptor'),
+	Get: require('./2017/Get'),
+	GetIterator: require('./2017/GetIterator'),
+	GetMethod: require('./2017/GetMethod'),
+	GetOwnPropertyKeys: require('./2017/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2017/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2017/GetSubstitution'),
+	GetV: require('./2017/GetV'),
+	HasOwnProperty: require('./2017/HasOwnProperty'),
+	HasProperty: require('./2017/HasProperty'),
+	HourFromTime: require('./2017/HourFromTime'),
+	InLeapYear: require('./2017/InLeapYear'),
+	InstanceofOperator: require('./2017/InstanceofOperator'),
+	Invoke: require('./2017/Invoke'),
+	IsAccessorDescriptor: require('./2017/IsAccessorDescriptor'),
+	IsArray: require('./2017/IsArray'),
+	IsCallable: require('./2017/IsCallable'),
+	IsConcatSpreadable: require('./2017/IsConcatSpreadable'),
+	IsConstructor: require('./2017/IsConstructor'),
+	IsDataDescriptor: require('./2017/IsDataDescriptor'),
+	IsExtensible: require('./2017/IsExtensible'),
+	IsGenericDescriptor: require('./2017/IsGenericDescriptor'),
+	IsInteger: require('./2017/IsInteger'),
+	IsPromise: require('./2017/IsPromise'),
+	IsPropertyDescriptor: require('./2017/IsPropertyDescriptor'),
+	IsPropertyKey: require('./2017/IsPropertyKey'),
+	IsRegExp: require('./2017/IsRegExp'),
+	IterableToList: require('./2017/IterableToList'),
+	IteratorClose: require('./2017/IteratorClose'),
+	IteratorComplete: require('./2017/IteratorComplete'),
+	IteratorNext: require('./2017/IteratorNext'),
+	IteratorStep: require('./2017/IteratorStep'),
+	IteratorValue: require('./2017/IteratorValue'),
+	MakeDate: require('./2017/MakeDate'),
+	MakeDay: require('./2017/MakeDay'),
+	MakeTime: require('./2017/MakeTime'),
+	MinFromTime: require('./2017/MinFromTime'),
+	modulo: require('./2017/modulo'),
+	MonthFromTime: require('./2017/MonthFromTime'),
+	msFromTime: require('./2017/msFromTime'),
+	ObjectCreate: require('./2017/ObjectCreate'),
+	OrdinaryCreateFromConstructor: require('./2017/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2017/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2017/OrdinaryGetOwnProperty'),
+	OrdinaryGetPrototypeOf: require('./2017/OrdinaryGetPrototypeOf'),
+	OrdinaryHasInstance: require('./2017/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2017/OrdinaryHasProperty'),
+	OrdinarySetPrototypeOf: require('./2017/OrdinarySetPrototypeOf'),
+	QuoteJSONString: require('./2017/QuoteJSONString'),
+	RegExpCreate: require('./2017/RegExpCreate'),
+	RegExpExec: require('./2017/RegExpExec'),
+	RequireObjectCoercible: require('./2017/RequireObjectCoercible'),
+	SameValue: require('./2017/SameValue'),
+	SameValueNonNumber: require('./2017/SameValueNonNumber'),
+	SameValueZero: require('./2017/SameValueZero'),
+	SecFromTime: require('./2017/SecFromTime'),
+	Set: require('./2017/Set'),
+	SetFunctionName: require('./2017/SetFunctionName'),
+	SetIntegrityLevel: require('./2017/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2017/SpeciesConstructor'),
+	SplitMatch: require('./2017/SplitMatch'),
+	StringCreate: require('./2017/StringCreate'),
+	StringGetOwnProperty: require('./2017/StringGetOwnProperty'),
+	SymbolDescriptiveString: require('./2017/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2017/TestIntegrityLevel'),
+	thisBooleanValue: require('./2017/thisBooleanValue'),
+	thisNumberValue: require('./2017/thisNumberValue'),
+	thisStringValue: require('./2017/thisStringValue'),
+	thisTimeValue: require('./2017/thisTimeValue'),
+	TimeClip: require('./2017/TimeClip'),
+	TimeFromYear: require('./2017/TimeFromYear'),
+	TimeWithinDay: require('./2017/TimeWithinDay'),
+	ToBoolean: require('./2017/ToBoolean'),
+	ToDateString: require('./2017/ToDateString'),
+	ToIndex: require('./2017/ToIndex'),
+	ToInt16: require('./2017/ToInt16'),
+	ToInt32: require('./2017/ToInt32'),
+	ToInt8: require('./2017/ToInt8'),
+	ToInteger: require('./2017/ToInteger'),
+	ToLength: require('./2017/ToLength'),
+	ToNumber: require('./2017/ToNumber'),
+	ToObject: require('./2017/ToObject'),
+	ToPrimitive: require('./2017/ToPrimitive'),
+	ToPropertyDescriptor: require('./2017/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2017/ToPropertyKey'),
+	ToString: require('./2017/ToString'),
+	ToUint16: require('./2017/ToUint16'),
+	ToUint32: require('./2017/ToUint32'),
+	ToUint8: require('./2017/ToUint8'),
+	ToUint8Clamp: require('./2017/ToUint8Clamp'),
+	Type: require('./2017/Type'),
+	UTF16Decode: require('./2017/UTF16Decode'),
+	UTF16Encoding: require('./2017/UTF16Encoding'),
+	ValidateAndApplyPropertyDescriptor: require('./2017/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2017/WeekDay'),
+	YearFromTime: require('./2017/YearFromTime')
+};
+
+module.exports = ES2017;
diff --git a/node_modules/es-abstract/es2018.js b/node_modules/es-abstract/es2018.js
new file mode 100644
index 0000000..2beb989
--- /dev/null
+++ b/node_modules/es-abstract/es2018.js
@@ -0,0 +1,138 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://262.ecma-international.org/9.0/#sec-abstract-operations
+var ES2018 = {
+	'Abstract Equality Comparison': require('./2018/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2018/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2018/StrictEqualityComparison'),
+	abs: require('./2018/abs'),
+	AdvanceStringIndex: require('./2018/AdvanceStringIndex'),
+	ArrayCreate: require('./2018/ArrayCreate'),
+	ArraySetLength: require('./2018/ArraySetLength'),
+	ArraySpeciesCreate: require('./2018/ArraySpeciesCreate'),
+	Call: require('./2018/Call'),
+	CanonicalNumericIndexString: require('./2018/CanonicalNumericIndexString'),
+	CompletePropertyDescriptor: require('./2018/CompletePropertyDescriptor'),
+	CopyDataProperties: require('./2018/CopyDataProperties'),
+	CreateDataProperty: require('./2018/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2018/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2018/CreateHTML'),
+	CreateIterResultObject: require('./2018/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2018/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2018/CreateMethodProperty'),
+	DateFromTime: require('./2018/DateFromTime'),
+	DateString: require('./2018/DateString'),
+	Day: require('./2018/Day'),
+	DayFromYear: require('./2018/DayFromYear'),
+	DaysInYear: require('./2018/DaysInYear'),
+	DayWithinYear: require('./2018/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2018/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2018/DeletePropertyOrThrow'),
+	EnumerableOwnPropertyNames: require('./2018/EnumerableOwnPropertyNames'),
+	floor: require('./2018/floor'),
+	FromPropertyDescriptor: require('./2018/FromPropertyDescriptor'),
+	Get: require('./2018/Get'),
+	GetIterator: require('./2018/GetIterator'),
+	GetMethod: require('./2018/GetMethod'),
+	GetOwnPropertyKeys: require('./2018/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2018/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2018/GetSubstitution'),
+	GetV: require('./2018/GetV'),
+	HasOwnProperty: require('./2018/HasOwnProperty'),
+	HasProperty: require('./2018/HasProperty'),
+	HourFromTime: require('./2018/HourFromTime'),
+	InLeapYear: require('./2018/InLeapYear'),
+	InstanceofOperator: require('./2018/InstanceofOperator'),
+	Invoke: require('./2018/Invoke'),
+	IsAccessorDescriptor: require('./2018/IsAccessorDescriptor'),
+	IsArray: require('./2018/IsArray'),
+	IsCallable: require('./2018/IsCallable'),
+	IsConcatSpreadable: require('./2018/IsConcatSpreadable'),
+	IsConstructor: require('./2018/IsConstructor'),
+	IsDataDescriptor: require('./2018/IsDataDescriptor'),
+	IsExtensible: require('./2018/IsExtensible'),
+	IsGenericDescriptor: require('./2018/IsGenericDescriptor'),
+	IsInteger: require('./2018/IsInteger'),
+	IsPromise: require('./2018/IsPromise'),
+	IsPropertyKey: require('./2018/IsPropertyKey'),
+	IsRegExp: require('./2018/IsRegExp'),
+	IsStringPrefix: require('./2018/IsStringPrefix'),
+	IterableToList: require('./2018/IterableToList'),
+	IteratorClose: require('./2018/IteratorClose'),
+	IteratorComplete: require('./2018/IteratorComplete'),
+	IteratorNext: require('./2018/IteratorNext'),
+	IteratorStep: require('./2018/IteratorStep'),
+	IteratorValue: require('./2018/IteratorValue'),
+	MakeDate: require('./2018/MakeDate'),
+	MakeDay: require('./2018/MakeDay'),
+	MakeTime: require('./2018/MakeTime'),
+	MinFromTime: require('./2018/MinFromTime'),
+	modulo: require('./2018/modulo'),
+	MonthFromTime: require('./2018/MonthFromTime'),
+	msFromTime: require('./2018/msFromTime'),
+	NumberToString: require('./2018/NumberToString'),
+	ObjectCreate: require('./2018/ObjectCreate'),
+	OrdinaryCreateFromConstructor: require('./2018/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2018/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2018/OrdinaryGetOwnProperty'),
+	OrdinaryGetPrototypeOf: require('./2018/OrdinaryGetPrototypeOf'),
+	OrdinaryHasInstance: require('./2018/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2018/OrdinaryHasProperty'),
+	OrdinarySetPrototypeOf: require('./2018/OrdinarySetPrototypeOf'),
+	PromiseResolve: require('./2018/PromiseResolve'),
+	QuoteJSONString: require('./2018/QuoteJSONString'),
+	RegExpCreate: require('./2018/RegExpCreate'),
+	RegExpExec: require('./2018/RegExpExec'),
+	RequireObjectCoercible: require('./2018/RequireObjectCoercible'),
+	SameValue: require('./2018/SameValue'),
+	SameValueNonNumber: require('./2018/SameValueNonNumber'),
+	SameValueZero: require('./2018/SameValueZero'),
+	SecFromTime: require('./2018/SecFromTime'),
+	Set: require('./2018/Set'),
+	SetFunctionLength: require('./2018/SetFunctionLength'),
+	SetFunctionName: require('./2018/SetFunctionName'),
+	SetIntegrityLevel: require('./2018/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2018/SpeciesConstructor'),
+	SplitMatch: require('./2018/SplitMatch'),
+	StringCreate: require('./2018/StringCreate'),
+	StringGetOwnProperty: require('./2018/StringGetOwnProperty'),
+	SymbolDescriptiveString: require('./2018/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2018/TestIntegrityLevel'),
+	thisBooleanValue: require('./2018/thisBooleanValue'),
+	thisNumberValue: require('./2018/thisNumberValue'),
+	thisStringValue: require('./2018/thisStringValue'),
+	thisSymbolValue: require('./2018/thisSymbolValue'),
+	thisTimeValue: require('./2018/thisTimeValue'),
+	TimeClip: require('./2018/TimeClip'),
+	TimeFromYear: require('./2018/TimeFromYear'),
+	TimeString: require('./2018/TimeString'),
+	TimeWithinDay: require('./2018/TimeWithinDay'),
+	ToBoolean: require('./2018/ToBoolean'),
+	ToDateString: require('./2018/ToDateString'),
+	ToIndex: require('./2018/ToIndex'),
+	ToInt16: require('./2018/ToInt16'),
+	ToInt32: require('./2018/ToInt32'),
+	ToInt8: require('./2018/ToInt8'),
+	ToInteger: require('./2018/ToInteger'),
+	ToLength: require('./2018/ToLength'),
+	ToNumber: require('./2018/ToNumber'),
+	ToObject: require('./2018/ToObject'),
+	ToPrimitive: require('./2018/ToPrimitive'),
+	ToPropertyDescriptor: require('./2018/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2018/ToPropertyKey'),
+	ToString: require('./2018/ToString'),
+	ToUint16: require('./2018/ToUint16'),
+	ToUint32: require('./2018/ToUint32'),
+	ToUint8: require('./2018/ToUint8'),
+	ToUint8Clamp: require('./2018/ToUint8Clamp'),
+	Type: require('./2018/Type'),
+	UnicodeEscape: require('./2018/UnicodeEscape'),
+	UTF16Decode: require('./2018/UTF16Decode'),
+	UTF16Encoding: require('./2018/UTF16Encoding'),
+	ValidateAndApplyPropertyDescriptor: require('./2018/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2018/WeekDay'),
+	YearFromTime: require('./2018/YearFromTime')
+};
+
+module.exports = ES2018;
diff --git a/node_modules/es-abstract/es2019.js b/node_modules/es-abstract/es2019.js
new file mode 100644
index 0000000..a49e115
--- /dev/null
+++ b/node_modules/es-abstract/es2019.js
@@ -0,0 +1,141 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://262.ecma-international.org/10.0/#sec-abstract-operations
+var ES2019 = {
+	'Abstract Equality Comparison': require('./2019/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2019/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2019/StrictEqualityComparison'),
+	abs: require('./2019/abs'),
+	AddEntriesFromIterable: require('./2019/AddEntriesFromIterable'),
+	AdvanceStringIndex: require('./2019/AdvanceStringIndex'),
+	ArrayCreate: require('./2019/ArrayCreate'),
+	ArraySetLength: require('./2019/ArraySetLength'),
+	ArraySpeciesCreate: require('./2019/ArraySpeciesCreate'),
+	Call: require('./2019/Call'),
+	CanonicalNumericIndexString: require('./2019/CanonicalNumericIndexString'),
+	CompletePropertyDescriptor: require('./2019/CompletePropertyDescriptor'),
+	CopyDataProperties: require('./2019/CopyDataProperties'),
+	CreateDataProperty: require('./2019/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2019/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2019/CreateHTML'),
+	CreateIterResultObject: require('./2019/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2019/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2019/CreateMethodProperty'),
+	DateFromTime: require('./2019/DateFromTime'),
+	DateString: require('./2019/DateString'),
+	Day: require('./2019/Day'),
+	DayFromYear: require('./2019/DayFromYear'),
+	DaysInYear: require('./2019/DaysInYear'),
+	DayWithinYear: require('./2019/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2019/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2019/DeletePropertyOrThrow'),
+	EnumerableOwnPropertyNames: require('./2019/EnumerableOwnPropertyNames'),
+	FlattenIntoArray: require('./2019/FlattenIntoArray'),
+	floor: require('./2019/floor'),
+	FromPropertyDescriptor: require('./2019/FromPropertyDescriptor'),
+	Get: require('./2019/Get'),
+	GetIterator: require('./2019/GetIterator'),
+	GetMethod: require('./2019/GetMethod'),
+	GetOwnPropertyKeys: require('./2019/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2019/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2019/GetSubstitution'),
+	GetV: require('./2019/GetV'),
+	HasOwnProperty: require('./2019/HasOwnProperty'),
+	HasProperty: require('./2019/HasProperty'),
+	HourFromTime: require('./2019/HourFromTime'),
+	InLeapYear: require('./2019/InLeapYear'),
+	InstanceofOperator: require('./2019/InstanceofOperator'),
+	Invoke: require('./2019/Invoke'),
+	IsAccessorDescriptor: require('./2019/IsAccessorDescriptor'),
+	IsArray: require('./2019/IsArray'),
+	IsCallable: require('./2019/IsCallable'),
+	IsConcatSpreadable: require('./2019/IsConcatSpreadable'),
+	IsConstructor: require('./2019/IsConstructor'),
+	IsDataDescriptor: require('./2019/IsDataDescriptor'),
+	IsExtensible: require('./2019/IsExtensible'),
+	IsGenericDescriptor: require('./2019/IsGenericDescriptor'),
+	IsInteger: require('./2019/IsInteger'),
+	IsPromise: require('./2019/IsPromise'),
+	IsPropertyKey: require('./2019/IsPropertyKey'),
+	IsRegExp: require('./2019/IsRegExp'),
+	IsStringPrefix: require('./2019/IsStringPrefix'),
+	IterableToList: require('./2019/IterableToList'),
+	IteratorClose: require('./2019/IteratorClose'),
+	IteratorComplete: require('./2019/IteratorComplete'),
+	IteratorNext: require('./2019/IteratorNext'),
+	IteratorStep: require('./2019/IteratorStep'),
+	IteratorValue: require('./2019/IteratorValue'),
+	MakeDate: require('./2019/MakeDate'),
+	MakeDay: require('./2019/MakeDay'),
+	MakeTime: require('./2019/MakeTime'),
+	MinFromTime: require('./2019/MinFromTime'),
+	modulo: require('./2019/modulo'),
+	MonthFromTime: require('./2019/MonthFromTime'),
+	msFromTime: require('./2019/msFromTime'),
+	NumberToString: require('./2019/NumberToString'),
+	ObjectCreate: require('./2019/ObjectCreate'),
+	OrdinaryCreateFromConstructor: require('./2019/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2019/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2019/OrdinaryGetOwnProperty'),
+	OrdinaryGetPrototypeOf: require('./2019/OrdinaryGetPrototypeOf'),
+	OrdinaryHasInstance: require('./2019/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2019/OrdinaryHasProperty'),
+	OrdinarySetPrototypeOf: require('./2019/OrdinarySetPrototypeOf'),
+	PromiseResolve: require('./2019/PromiseResolve'),
+	QuoteJSONString: require('./2019/QuoteJSONString'),
+	RegExpCreate: require('./2019/RegExpCreate'),
+	RegExpExec: require('./2019/RegExpExec'),
+	RequireObjectCoercible: require('./2019/RequireObjectCoercible'),
+	SameValue: require('./2019/SameValue'),
+	SameValueNonNumber: require('./2019/SameValueNonNumber'),
+	SameValueZero: require('./2019/SameValueZero'),
+	SecFromTime: require('./2019/SecFromTime'),
+	Set: require('./2019/Set'),
+	SetFunctionLength: require('./2019/SetFunctionLength'),
+	SetFunctionName: require('./2019/SetFunctionName'),
+	SetIntegrityLevel: require('./2019/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2019/SpeciesConstructor'),
+	SplitMatch: require('./2019/SplitMatch'),
+	StringCreate: require('./2019/StringCreate'),
+	StringGetOwnProperty: require('./2019/StringGetOwnProperty'),
+	SymbolDescriptiveString: require('./2019/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2019/TestIntegrityLevel'),
+	thisBooleanValue: require('./2019/thisBooleanValue'),
+	thisNumberValue: require('./2019/thisNumberValue'),
+	thisStringValue: require('./2019/thisStringValue'),
+	thisSymbolValue: require('./2019/thisSymbolValue'),
+	thisTimeValue: require('./2019/thisTimeValue'),
+	TimeClip: require('./2019/TimeClip'),
+	TimeFromYear: require('./2019/TimeFromYear'),
+	TimeString: require('./2019/TimeString'),
+	TimeWithinDay: require('./2019/TimeWithinDay'),
+	ToBoolean: require('./2019/ToBoolean'),
+	ToDateString: require('./2019/ToDateString'),
+	ToIndex: require('./2019/ToIndex'),
+	ToInt16: require('./2019/ToInt16'),
+	ToInt32: require('./2019/ToInt32'),
+	ToInt8: require('./2019/ToInt8'),
+	ToInteger: require('./2019/ToInteger'),
+	ToLength: require('./2019/ToLength'),
+	ToNumber: require('./2019/ToNumber'),
+	ToObject: require('./2019/ToObject'),
+	ToPrimitive: require('./2019/ToPrimitive'),
+	ToPropertyDescriptor: require('./2019/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2019/ToPropertyKey'),
+	ToString: require('./2019/ToString'),
+	ToUint16: require('./2019/ToUint16'),
+	ToUint32: require('./2019/ToUint32'),
+	ToUint8: require('./2019/ToUint8'),
+	ToUint8Clamp: require('./2019/ToUint8Clamp'),
+	TrimString: require('./2019/TrimString'),
+	Type: require('./2019/Type'),
+	UnicodeEscape: require('./2019/UnicodeEscape'),
+	UTF16Decode: require('./2019/UTF16Decode'),
+	UTF16Encoding: require('./2019/UTF16Encoding'),
+	ValidateAndApplyPropertyDescriptor: require('./2019/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2019/WeekDay'),
+	YearFromTime: require('./2019/YearFromTime')
+};
+
+module.exports = ES2019;
diff --git a/node_modules/es-abstract/es2020.js b/node_modules/es-abstract/es2020.js
new file mode 100644
index 0000000..e6d1c79
--- /dev/null
+++ b/node_modules/es-abstract/es2020.js
@@ -0,0 +1,159 @@
+'use strict';
+
+/* eslint global-require: 0 */
+// https://ecma-international.org/ecma-262/11.0/#sec-abstract-operations
+var ES2020 = {
+	'Abstract Equality Comparison': require('./2020/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./2020/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./2020/StrictEqualityComparison'),
+	abs: require('./2020/abs'),
+	AddEntriesFromIterable: require('./2020/AddEntriesFromIterable'),
+	AdvanceStringIndex: require('./2020/AdvanceStringIndex'),
+	ArrayCreate: require('./2020/ArrayCreate'),
+	ArraySetLength: require('./2020/ArraySetLength'),
+	ArraySpeciesCreate: require('./2020/ArraySpeciesCreate'),
+	BigInt: require('./2020/BigInt'),
+	BigIntBitwiseOp: require('./2020/BigIntBitwiseOp'),
+	BinaryAnd: require('./2020/BinaryAnd'),
+	BinaryOr: require('./2020/BinaryOr'),
+	BinaryXor: require('./2020/BinaryXor'),
+	Call: require('./2020/Call'),
+	CanonicalNumericIndexString: require('./2020/CanonicalNumericIndexString'),
+	CodePointAt: require('./2020/CodePointAt'),
+	CompletePropertyDescriptor: require('./2020/CompletePropertyDescriptor'),
+	CopyDataProperties: require('./2020/CopyDataProperties'),
+	CreateDataProperty: require('./2020/CreateDataProperty'),
+	CreateDataPropertyOrThrow: require('./2020/CreateDataPropertyOrThrow'),
+	CreateHTML: require('./2020/CreateHTML'),
+	CreateIterResultObject: require('./2020/CreateIterResultObject'),
+	CreateListFromArrayLike: require('./2020/CreateListFromArrayLike'),
+	CreateMethodProperty: require('./2020/CreateMethodProperty'),
+	DateFromTime: require('./2020/DateFromTime'),
+	DateString: require('./2020/DateString'),
+	Day: require('./2020/Day'),
+	DayFromYear: require('./2020/DayFromYear'),
+	DaysInYear: require('./2020/DaysInYear'),
+	DayWithinYear: require('./2020/DayWithinYear'),
+	DefinePropertyOrThrow: require('./2020/DefinePropertyOrThrow'),
+	DeletePropertyOrThrow: require('./2020/DeletePropertyOrThrow'),
+	EnumerableOwnPropertyNames: require('./2020/EnumerableOwnPropertyNames'),
+	FlattenIntoArray: require('./2020/FlattenIntoArray'),
+	floor: require('./2020/floor'),
+	FromPropertyDescriptor: require('./2020/FromPropertyDescriptor'),
+	Get: require('./2020/Get'),
+	GetIterator: require('./2020/GetIterator'),
+	GetMethod: require('./2020/GetMethod'),
+	GetOwnPropertyKeys: require('./2020/GetOwnPropertyKeys'),
+	GetPrototypeFromConstructor: require('./2020/GetPrototypeFromConstructor'),
+	GetSubstitution: require('./2020/GetSubstitution'),
+	GetV: require('./2020/GetV'),
+	HasOwnProperty: require('./2020/HasOwnProperty'),
+	HasProperty: require('./2020/HasProperty'),
+	HourFromTime: require('./2020/HourFromTime'),
+	InLeapYear: require('./2020/InLeapYear'),
+	InstanceofOperator: require('./2020/InstanceofOperator'),
+	Invoke: require('./2020/Invoke'),
+	IsAccessorDescriptor: require('./2020/IsAccessorDescriptor'),
+	IsArray: require('./2020/IsArray'),
+	IsBigIntElementType: require('./2020/IsBigIntElementType'),
+	IsCallable: require('./2020/IsCallable'),
+	IsConcatSpreadable: require('./2020/IsConcatSpreadable'),
+	IsConstructor: require('./2020/IsConstructor'),
+	IsDataDescriptor: require('./2020/IsDataDescriptor'),
+	IsExtensible: require('./2020/IsExtensible'),
+	IsGenericDescriptor: require('./2020/IsGenericDescriptor'),
+	IsInteger: require('./2020/IsInteger'),
+	IsNonNegativeInteger: require('./2020/IsNonNegativeInteger'),
+	IsNoTearConfiguration: require('./2020/IsNoTearConfiguration'),
+	IsPromise: require('./2020/IsPromise'),
+	IsPropertyKey: require('./2020/IsPropertyKey'),
+	IsRegExp: require('./2020/IsRegExp'),
+	IsStringPrefix: require('./2020/IsStringPrefix'),
+	IsUnclampedIntegerElementType: require('./2020/IsUnclampedIntegerElementType'),
+	IsUnsignedElementType: require('./2020/IsUnsignedElementType'),
+	IterableToList: require('./2020/IterableToList'),
+	IteratorClose: require('./2020/IteratorClose'),
+	IteratorComplete: require('./2020/IteratorComplete'),
+	IteratorNext: require('./2020/IteratorNext'),
+	IteratorStep: require('./2020/IteratorStep'),
+	IteratorValue: require('./2020/IteratorValue'),
+	LengthOfArrayLike: require('./2020/LengthOfArrayLike'),
+	MakeDate: require('./2020/MakeDate'),
+	MakeDay: require('./2020/MakeDay'),
+	MakeTime: require('./2020/MakeTime'),
+	MinFromTime: require('./2020/MinFromTime'),
+	modulo: require('./2020/modulo'),
+	MonthFromTime: require('./2020/MonthFromTime'),
+	msFromTime: require('./2020/msFromTime'),
+	Number: require('./2020/Number'),
+	NumberBitwiseOp: require('./2020/NumberBitwiseOp'),
+	NumberToBigInt: require('./2020/NumberToBigInt'),
+	OrdinaryCreateFromConstructor: require('./2020/OrdinaryCreateFromConstructor'),
+	OrdinaryDefineOwnProperty: require('./2020/OrdinaryDefineOwnProperty'),
+	OrdinaryGetOwnProperty: require('./2020/OrdinaryGetOwnProperty'),
+	OrdinaryGetPrototypeOf: require('./2020/OrdinaryGetPrototypeOf'),
+	OrdinaryHasInstance: require('./2020/OrdinaryHasInstance'),
+	OrdinaryHasProperty: require('./2020/OrdinaryHasProperty'),
+	OrdinaryObjectCreate: require('./2020/OrdinaryObjectCreate'),
+	OrdinarySetPrototypeOf: require('./2020/OrdinarySetPrototypeOf'),
+	PromiseResolve: require('./2020/PromiseResolve'),
+	QuoteJSONString: require('./2020/QuoteJSONString'),
+	RegExpCreate: require('./2020/RegExpCreate'),
+	RegExpExec: require('./2020/RegExpExec'),
+	RequireObjectCoercible: require('./2020/RequireObjectCoercible'),
+	SameValue: require('./2020/SameValue'),
+	SameValueNonNumeric: require('./2020/SameValueNonNumeric'),
+	SameValueZero: require('./2020/SameValueZero'),
+	SecFromTime: require('./2020/SecFromTime'),
+	Set: require('./2020/Set'),
+	SetFunctionLength: require('./2020/SetFunctionLength'),
+	SetFunctionName: require('./2020/SetFunctionName'),
+	SetIntegrityLevel: require('./2020/SetIntegrityLevel'),
+	SpeciesConstructor: require('./2020/SpeciesConstructor'),
+	SplitMatch: require('./2020/SplitMatch'),
+	StringCreate: require('./2020/StringCreate'),
+	StringGetOwnProperty: require('./2020/StringGetOwnProperty'),
+	StringPad: require('./2020/StringPad'),
+	SymbolDescriptiveString: require('./2020/SymbolDescriptiveString'),
+	TestIntegrityLevel: require('./2020/TestIntegrityLevel'),
+	thisBigIntValue: require('./2020/thisBigIntValue'),
+	thisBooleanValue: require('./2020/thisBooleanValue'),
+	thisNumberValue: require('./2020/thisNumberValue'),
+	thisStringValue: require('./2020/thisStringValue'),
+	thisSymbolValue: require('./2020/thisSymbolValue'),
+	thisTimeValue: require('./2020/thisTimeValue'),
+	TimeClip: require('./2020/TimeClip'),
+	TimeFromYear: require('./2020/TimeFromYear'),
+	TimeString: require('./2020/TimeString'),
+	TimeWithinDay: require('./2020/TimeWithinDay'),
+	ToBoolean: require('./2020/ToBoolean'),
+	ToDateString: require('./2020/ToDateString'),
+	ToIndex: require('./2020/ToIndex'),
+	ToInt16: require('./2020/ToInt16'),
+	ToInt32: require('./2020/ToInt32'),
+	ToInt8: require('./2020/ToInt8'),
+	ToInteger: require('./2020/ToInteger'),
+	ToLength: require('./2020/ToLength'),
+	ToNumber: require('./2020/ToNumber'),
+	ToNumeric: require('./2020/ToNumeric'),
+	ToObject: require('./2020/ToObject'),
+	ToPrimitive: require('./2020/ToPrimitive'),
+	ToPropertyDescriptor: require('./2020/ToPropertyDescriptor'),
+	ToPropertyKey: require('./2020/ToPropertyKey'),
+	ToString: require('./2020/ToString'),
+	ToUint16: require('./2020/ToUint16'),
+	ToUint32: require('./2020/ToUint32'),
+	ToUint8: require('./2020/ToUint8'),
+	ToUint8Clamp: require('./2020/ToUint8Clamp'),
+	TrimString: require('./2020/TrimString'),
+	Type: require('./2020/Type'),
+	UnicodeEscape: require('./2020/UnicodeEscape'),
+	UTF16DecodeString: require('./2020/UTF16DecodeString'),
+	UTF16DecodeSurrogatePair: require('./2020/UTF16DecodeSurrogatePair'),
+	UTF16Encoding: require('./2020/UTF16Encoding'),
+	ValidateAndApplyPropertyDescriptor: require('./2020/ValidateAndApplyPropertyDescriptor'),
+	WeekDay: require('./2020/WeekDay'),
+	YearFromTime: require('./2020/YearFromTime')
+};
+
+module.exports = ES2020;
diff --git a/node_modules/es-abstract/es5.js b/node_modules/es-abstract/es5.js
new file mode 100644
index 0000000..46eb6e1
--- /dev/null
+++ b/node_modules/es-abstract/es5.js
@@ -0,0 +1,51 @@
+'use strict';
+
+/* eslint global-require: 0 */
+
+// https://es5.github.io/#x9
+module.exports = {
+	'Abstract Equality Comparison': require('./5/AbstractEqualityComparison'),
+	'Abstract Relational Comparison': require('./5/AbstractRelationalComparison'),
+	'Strict Equality Comparison': require('./5/StrictEqualityComparison'),
+	abs: require('./5/abs'),
+	CheckObjectCoercible: require('./5/CheckObjectCoercible'),
+	DateFromTime: require('./5/DateFromTime'),
+	Day: require('./5/Day'),
+	DayFromYear: require('./5/DayFromYear'),
+	DaysInYear: require('./5/DaysInYear'),
+	DayWithinYear: require('./5/DayWithinYear'),
+	floor: require('./5/floor'),
+	FromPropertyDescriptor: require('./5/FromPropertyDescriptor'),
+	HourFromTime: require('./5/HourFromTime'),
+	InLeapYear: require('./5/InLeapYear'),
+	IsAccessorDescriptor: require('./5/IsAccessorDescriptor'),
+	IsCallable: require('./5/IsCallable'),
+	IsDataDescriptor: require('./5/IsDataDescriptor'),
+	IsGenericDescriptor: require('./5/IsGenericDescriptor'),
+	IsPropertyDescriptor: require('./5/IsPropertyDescriptor'),
+	MakeDate: require('./5/MakeDate'),
+	MakeDay: require('./5/MakeDay'),
+	MakeTime: require('./5/MakeTime'),
+	MinFromTime: require('./5/MinFromTime'),
+	modulo: require('./5/modulo'),
+	MonthFromTime: require('./5/MonthFromTime'),
+	msFromTime: require('./5/msFromTime'),
+	SameValue: require('./5/SameValue'),
+	SecFromTime: require('./5/SecFromTime'),
+	TimeClip: require('./5/TimeClip'),
+	TimeFromYear: require('./5/TimeFromYear'),
+	TimeWithinDay: require('./5/TimeWithinDay'),
+	ToBoolean: require('./5/ToBoolean'),
+	ToInt32: require('./5/ToInt32'),
+	ToInteger: require('./5/ToInteger'),
+	ToNumber: require('./5/ToNumber'),
+	ToObject: require('./5/ToObject'),
+	ToPrimitive: require('./5/ToPrimitive'),
+	ToPropertyDescriptor: require('./5/ToPropertyDescriptor'),
+	ToString: require('./5/ToString'),
+	ToUint16: require('./5/ToUint16'),
+	ToUint32: require('./5/ToUint32'),
+	Type: require('./5/Type'),
+	WeekDay: require('./5/WeekDay'),
+	YearFromTime: require('./5/YearFromTime')
+};
diff --git a/node_modules/es-abstract/es6.js b/node_modules/es-abstract/es6.js
new file mode 100644
index 0000000..2d1f4dc
--- /dev/null
+++ b/node_modules/es-abstract/es6.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./es2015');
diff --git a/node_modules/es-abstract/es7.js b/node_modules/es-abstract/es7.js
new file mode 100644
index 0000000..f2f15c0
--- /dev/null
+++ b/node_modules/es-abstract/es7.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./es2016');
diff --git a/node_modules/es-abstract/helpers/DefineOwnProperty.js b/node_modules/es-abstract/helpers/DefineOwnProperty.js
new file mode 100644
index 0000000..1a378a4
--- /dev/null
+++ b/node_modules/es-abstract/helpers/DefineOwnProperty.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
+
+if ($defineProperty) {
+	try {
+		$defineProperty({}, 'a', { value: 1 });
+	} catch (e) {
+		// IE 8 has a broken defineProperty
+		$defineProperty = null;
+	}
+}
+
+var callBound = require('call-bind/callBound');
+
+var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
+
+// eslint-disable-next-line max-params
+module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
+	if (!$defineProperty) {
+		if (!IsDataDescriptor(desc)) {
+			// ES3 does not support getters/setters
+			return false;
+		}
+		if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
+			return false;
+		}
+
+		// fallback for ES3
+		if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
+			// a non-enumerable existing property
+			return false;
+		}
+
+		// property does not exist at all, or exists but is enumerable
+		var V = desc['[[Value]]'];
+		// eslint-disable-next-line no-param-reassign
+		O[P] = V; // will use [[Define]]
+		return SameValue(O[P], V);
+	}
+	$defineProperty(O, P, FromPropertyDescriptor(desc));
+	return true;
+};
diff --git a/node_modules/es-abstract/helpers/OwnPropertyKeys.js b/node_modules/es-abstract/helpers/OwnPropertyKeys.js
new file mode 100644
index 0000000..6baa986
--- /dev/null
+++ b/node_modules/es-abstract/helpers/OwnPropertyKeys.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBind = require('call-bind');
+var callBound = require('call-bind/callBound');
+
+var $ownKeys = GetIntrinsic('%Reflect.ownKeys%', true);
+var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
+var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
+var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
+var $gOPS = $SymbolValueOf ? GetIntrinsic('%Object.getOwnPropertySymbols%') : null;
+
+var keys = require('object-keys');
+
+module.exports = $ownKeys || function OwnPropertyKeys(source) {
+	var ownKeys = ($gOPN || keys)(source);
+	if ($gOPS) {
+		$pushApply(ownKeys, $gOPS(source));
+	}
+	return ownKeys;
+};
diff --git a/node_modules/es-abstract/helpers/assertRecord.js b/node_modules/es-abstract/helpers/assertRecord.js
new file mode 100644
index 0000000..623bc56
--- /dev/null
+++ b/node_modules/es-abstract/helpers/assertRecord.js
@@ -0,0 +1,48 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+
+var has = require('has');
+
+var predicates = {
+	// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
+	'Property Descriptor': function isPropertyDescriptor(Type, Desc) {
+		if (Type(Desc) !== 'Object') {
+			return false;
+		}
+		var allowed = {
+			'[[Configurable]]': true,
+			'[[Enumerable]]': true,
+			'[[Get]]': true,
+			'[[Set]]': true,
+			'[[Value]]': true,
+			'[[Writable]]': true
+		};
+
+		for (var key in Desc) { // eslint-disable-line
+			if (has(Desc, key) && !allowed[key]) {
+				return false;
+			}
+		}
+
+		var isData = has(Desc, '[[Value]]');
+		var IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');
+		if (isData && IsAccessor) {
+			throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
+		}
+		return true;
+	}
+};
+
+module.exports = function assertRecord(Type, recordType, argumentName, value) {
+	var predicate = predicates[recordType];
+	if (typeof predicate !== 'function') {
+		throw new $SyntaxError('unknown record type: ' + recordType);
+	}
+	if (!predicate(Type, value)) {
+		throw new $TypeError(argumentName + ' must be a ' + recordType);
+	}
+};
diff --git a/node_modules/es-abstract/helpers/assign.js b/node_modules/es-abstract/helpers/assign.js
new file mode 100644
index 0000000..56eeb1c
--- /dev/null
+++ b/node_modules/es-abstract/helpers/assign.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+
+var $assign = GetIntrinsic('%Object%').assign;
+
+module.exports = function assign(target, source) {
+	if ($assign) {
+		return $assign(target, source);
+	}
+
+	// eslint-disable-next-line no-restricted-syntax
+	for (var key in source) {
+		if (has(source, key)) {
+			// eslint-disable-next-line no-param-reassign
+			target[key] = source[key];
+		}
+	}
+	return target;
+};
diff --git a/node_modules/es-abstract/helpers/callBind.js b/node_modules/es-abstract/helpers/callBind.js
new file mode 100644
index 0000000..699dba7
--- /dev/null
+++ b/node_modules/es-abstract/helpers/callBind.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// TODO; semver-major: remove
+
+module.exports = require('call-bind');
diff --git a/node_modules/es-abstract/helpers/callBound.js b/node_modules/es-abstract/helpers/callBound.js
new file mode 100644
index 0000000..349030c
--- /dev/null
+++ b/node_modules/es-abstract/helpers/callBound.js
@@ -0,0 +1,5 @@
+'use strict';
+
+// TODO; semver-major: remove
+
+module.exports = require('call-bind/callBound');
diff --git a/node_modules/es-abstract/helpers/every.js b/node_modules/es-abstract/helpers/every.js
new file mode 100644
index 0000000..42a4582
--- /dev/null
+++ b/node_modules/es-abstract/helpers/every.js
@@ -0,0 +1,10 @@
+'use strict';
+
+module.exports = function every(array, predicate) {
+	for (var i = 0; i < array.length; i += 1) {
+		if (!predicate(array[i], i, array)) {
+			return false;
+		}
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/helpers/forEach.js b/node_modules/es-abstract/helpers/forEach.js
new file mode 100644
index 0000000..35915a6
--- /dev/null
+++ b/node_modules/es-abstract/helpers/forEach.js
@@ -0,0 +1,7 @@
+'use strict';
+
+module.exports = function forEach(array, callback) {
+	for (var i = 0; i < array.length; i += 1) {
+		callback(array[i], i, array); // eslint-disable-line callback-return
+	}
+};
diff --git a/node_modules/es-abstract/helpers/getInferredName.js b/node_modules/es-abstract/helpers/getInferredName.js
new file mode 100644
index 0000000..2dab6e7
--- /dev/null
+++ b/node_modules/es-abstract/helpers/getInferredName.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var getInferredName;
+try {
+	// eslint-disable-next-line no-new-func
+	getInferredName = Function('s', 'return { [s]() {} }[s].name;');
+} catch (e) {}
+
+var inferred = function () {};
+module.exports = getInferredName && inferred.name === 'inferred' ? getInferredName : null;
diff --git a/node_modules/es-abstract/helpers/getIteratorMethod.js b/node_modules/es-abstract/helpers/getIteratorMethod.js
new file mode 100644
index 0000000..fe581f4
--- /dev/null
+++ b/node_modules/es-abstract/helpers/getIteratorMethod.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var hasSymbols = require('has-symbols')();
+var GetIntrinsic = require('get-intrinsic');
+var callBound = require('call-bind/callBound');
+
+var $iterator = GetIntrinsic('%Symbol.iterator%', true);
+var $stringSlice = callBound('String.prototype.slice');
+
+module.exports = function getIteratorMethod(ES, iterable) {
+	var usingIterator;
+	if (hasSymbols) {
+		usingIterator = ES.GetMethod(iterable, $iterator);
+	} else if (ES.IsArray(iterable)) {
+		usingIterator = function () {
+			var i = -1;
+			var arr = this; // eslint-disable-line no-invalid-this
+			return {
+				next: function () {
+					i += 1;
+					return {
+						done: i >= arr.length,
+						value: arr[i]
+					};
+				}
+			};
+		};
+	} else if (ES.Type(iterable) === 'String') {
+		usingIterator = function () {
+			var i = 0;
+			return {
+				next: function () {
+					var nextIndex = ES.AdvanceStringIndex(iterable, i, true);
+					var value = $stringSlice(iterable, i, nextIndex);
+					i = nextIndex;
+					return {
+						done: nextIndex > iterable.length,
+						value: value
+					};
+				}
+			};
+		};
+	}
+	return usingIterator;
+};
diff --git a/node_modules/es-abstract/helpers/getOwnPropertyDescriptor.js b/node_modules/es-abstract/helpers/getOwnPropertyDescriptor.js
new file mode 100644
index 0000000..79cf048
--- /dev/null
+++ b/node_modules/es-abstract/helpers/getOwnPropertyDescriptor.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%');
+if ($gOPD) {
+	try {
+		$gOPD([], 'length');
+	} catch (e) {
+		// IE 8 has a broken gOPD
+		$gOPD = null;
+	}
+}
+
+module.exports = $gOPD;
diff --git a/node_modules/es-abstract/helpers/getProto.js b/node_modules/es-abstract/helpers/getProto.js
new file mode 100644
index 0000000..c190c7b
--- /dev/null
+++ b/node_modules/es-abstract/helpers/getProto.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var originalGetProto = GetIntrinsic('%Object.getPrototypeOf%', true);
+var $ArrayProto = GetIntrinsic('%Array.prototype%');
+
+module.exports = originalGetProto || (
+	// eslint-disable-next-line no-proto
+	[].__proto__ === $ArrayProto
+		? function (O) {
+			return O.__proto__; // eslint-disable-line no-proto
+		}
+		: null
+);
diff --git a/node_modules/es-abstract/helpers/getSymbolDescription.js b/node_modules/es-abstract/helpers/getSymbolDescription.js
new file mode 100644
index 0000000..e31cad2
--- /dev/null
+++ b/node_modules/es-abstract/helpers/getSymbolDescription.js
@@ -0,0 +1,41 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBound = require('call-bind/callBound');
+
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var getGlobalSymbolDescription = GetIntrinsic('%Symbol.keyFor%', true);
+var thisSymbolValue = callBound('%Symbol.prototype.valueOf%', true);
+var symToStr = callBound('Symbol.prototype.toString', true);
+
+var getInferredName = require('./getInferredName');
+
+/* eslint-disable consistent-return */
+module.exports = callBound('%Symbol.prototype.description%', true) || function getSymbolDescription(symbol) {
+	if (!thisSymbolValue) {
+		throw new $SyntaxError('Symbols are not supported in this environment');
+	}
+
+	// will throw if not a symbol primitive or wrapper object
+	var sym = thisSymbolValue(symbol);
+
+	if (getInferredName) {
+		var name = getInferredName(sym);
+		if (name === '') { return; }
+		return name.slice(1, -1); // name.slice('['.length, -']'.length);
+	}
+
+	var desc;
+	if (getGlobalSymbolDescription) {
+		desc = getGlobalSymbolDescription(sym);
+		if (typeof desc === 'string') {
+			return desc;
+		}
+	}
+
+	desc = symToStr(sym).slice(7, -1); // str.slice('Symbol('.length, -')'.length);
+	if (desc) {
+		return desc;
+	}
+};
diff --git a/node_modules/es-abstract/helpers/isByteValue.js b/node_modules/es-abstract/helpers/isByteValue.js
new file mode 100644
index 0000000..1a7d0d3
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isByteValue.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function isByteValue(value) {
+	return typeof value === 'number' && value >= 0 && value <= 255 && (value | 0) === value;
+};
diff --git a/node_modules/es-abstract/helpers/isCodePoint.js b/node_modules/es-abstract/helpers/isCodePoint.js
new file mode 100644
index 0000000..acda02e
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isCodePoint.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function isCodePoint(cp) {
+	return typeof cp === 'number' && cp >= 0 && cp <= 0x10FFFF && (cp | 0) === cp;
+};
diff --git a/node_modules/es-abstract/helpers/isFinite.js b/node_modules/es-abstract/helpers/isFinite.js
new file mode 100644
index 0000000..9e7cd4f
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isFinite.js
@@ -0,0 +1,5 @@
+'use strict';
+
+var $isNaN = Number.isNaN || function (a) { return a !== a; };
+
+module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
diff --git a/node_modules/es-abstract/helpers/isLeadingSurrogate.js b/node_modules/es-abstract/helpers/isLeadingSurrogate.js
new file mode 100644
index 0000000..fec61b2
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isLeadingSurrogate.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function isLeadingSurrogate(charCode) {
+	return typeof charCode === 'number' && charCode >= 0xD800 && charCode <= 0xDBFF;
+};
diff --git a/node_modules/es-abstract/helpers/isNaN.js b/node_modules/es-abstract/helpers/isNaN.js
new file mode 100644
index 0000000..cb8631d
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isNaN.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = Number.isNaN || function isNaN(a) {
+	return a !== a;
+};
diff --git a/node_modules/es-abstract/helpers/isPrefixOf.js b/node_modules/es-abstract/helpers/isPrefixOf.js
new file mode 100644
index 0000000..0f644d7
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isPrefixOf.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var $strSlice = require('call-bind/callBound')('String.prototype.slice');
+
+module.exports = function isPrefixOf(prefix, string) {
+	if (prefix === string) {
+		return true;
+	}
+	if (prefix.length > string.length) {
+		return false;
+	}
+	return $strSlice(string, 0, prefix.length) === prefix;
+};
diff --git a/node_modules/es-abstract/helpers/isPrimitive.js b/node_modules/es-abstract/helpers/isPrimitive.js
new file mode 100644
index 0000000..06f0bf0
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isPrimitive.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function isPrimitive(value) {
+	return value === null || (typeof value !== 'function' && typeof value !== 'object');
+};
diff --git a/node_modules/es-abstract/helpers/isPropertyDescriptor.js b/node_modules/es-abstract/helpers/isPropertyDescriptor.js
new file mode 100644
index 0000000..900964d
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isPropertyDescriptor.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var has = require('has');
+var $TypeError = GetIntrinsic('%TypeError%');
+
+module.exports = function IsPropertyDescriptor(ES, Desc) {
+	if (ES.Type(Desc) !== 'Object') {
+		return false;
+	}
+	var allowed = {
+		'[[Configurable]]': true,
+		'[[Enumerable]]': true,
+		'[[Get]]': true,
+		'[[Set]]': true,
+		'[[Value]]': true,
+		'[[Writable]]': true
+	};
+
+	for (var key in Desc) { // eslint-disable-line no-restricted-syntax
+		if (has(Desc, key) && !allowed[key]) {
+			return false;
+		}
+	}
+
+	if (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {
+		throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
+	}
+	return true;
+};
diff --git a/node_modules/es-abstract/helpers/isSamePropertyDescriptor.js b/node_modules/es-abstract/helpers/isSamePropertyDescriptor.js
new file mode 100644
index 0000000..a6162a1
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isSamePropertyDescriptor.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var every = require('./every');
+
+module.exports = function isSamePropertyDescriptor(ES, D1, D2) {
+	var fields = [
+		'[[Configurable]]',
+		'[[Enumerable]]',
+		'[[Get]]',
+		'[[Set]]',
+		'[[Value]]',
+		'[[Writable]]'
+	];
+	return every(fields, function (field) {
+		if ((field in D1) !== (field in D2)) {
+			return false;
+		}
+		return ES.SameValue(D1[field], D2[field]);
+	});
+};
diff --git a/node_modules/es-abstract/helpers/isTrailingSurrogate.js b/node_modules/es-abstract/helpers/isTrailingSurrogate.js
new file mode 100644
index 0000000..002930a
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isTrailingSurrogate.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function isTrailingSurrogate(charCode) {
+	return typeof charCode === 'number' && charCode >= 0xDC00 && charCode <= 0xDFFF;
+};
diff --git a/node_modules/es-abstract/helpers/maxSafeInteger.js b/node_modules/es-abstract/helpers/maxSafeInteger.js
new file mode 100644
index 0000000..89e5246
--- /dev/null
+++ b/node_modules/es-abstract/helpers/maxSafeInteger.js
@@ -0,0 +1,8 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $Math = GetIntrinsic('%Math%');
+var $Number = GetIntrinsic('%Number%');
+
+module.exports = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1;
diff --git a/node_modules/es-abstract/helpers/mod.js b/node_modules/es-abstract/helpers/mod.js
new file mode 100644
index 0000000..67c8b78
--- /dev/null
+++ b/node_modules/es-abstract/helpers/mod.js
@@ -0,0 +1,8 @@
+'use strict';
+
+var $floor = Math.floor;
+
+module.exports = function mod(number, modulo) {
+	var remain = number % modulo;
+	return $floor(remain >= 0 ? remain : remain + modulo);
+};
diff --git a/node_modules/es-abstract/helpers/padTimeComponent.js b/node_modules/es-abstract/helpers/padTimeComponent.js
new file mode 100644
index 0000000..0d8afc0
--- /dev/null
+++ b/node_modules/es-abstract/helpers/padTimeComponent.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBound = require('call-bind/callBound');
+
+var $strSlice = callBound('String.prototype.slice');
+
+module.exports = function padTimeComponent(c, count) {
+	return $strSlice('00' + c, -(count || 2));
+};
diff --git a/node_modules/es-abstract/helpers/regexTester.js b/node_modules/es-abstract/helpers/regexTester.js
new file mode 100644
index 0000000..b1699fb
--- /dev/null
+++ b/node_modules/es-abstract/helpers/regexTester.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var $test = GetIntrinsic('RegExp.prototype.test');
+
+var callBind = require('call-bind');
+
+module.exports = function regexTester(regex) {
+	return callBind($test, regex);
+};
diff --git a/node_modules/es-abstract/helpers/setProto.js b/node_modules/es-abstract/helpers/setProto.js
new file mode 100644
index 0000000..0ee884f
--- /dev/null
+++ b/node_modules/es-abstract/helpers/setProto.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var originalSetProto = GetIntrinsic('%Object.setPrototypeOf%', true);
+var $ArrayProto = GetIntrinsic('%Array.prototype%');
+
+module.exports = originalSetProto || (
+	// eslint-disable-next-line no-proto, no-negated-condition
+	[].__proto__ !== $ArrayProto
+		? null
+		: function (O, proto) {
+			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
+			return O;
+		}
+);
diff --git a/node_modules/es-abstract/helpers/sign.js b/node_modules/es-abstract/helpers/sign.js
new file mode 100644
index 0000000..598ea7d
--- /dev/null
+++ b/node_modules/es-abstract/helpers/sign.js
@@ -0,0 +1,5 @@
+'use strict';
+
+module.exports = function sign(number) {
+	return number >= 0 ? 1 : -1;
+};
diff --git a/node_modules/es-abstract/helpers/some.js b/node_modules/es-abstract/helpers/some.js
new file mode 100644
index 0000000..c0b4405
--- /dev/null
+++ b/node_modules/es-abstract/helpers/some.js
@@ -0,0 +1,10 @@
+'use strict';
+
+module.exports = function some(array, predicate) {
+	for (var i = 0; i < array.length; i += 1) {
+		if (predicate(array[i], i, array)) {
+			return true;
+		}
+	}
+	return false;
+};
diff --git a/node_modules/es-abstract/helpers/timeConstants.js b/node_modules/es-abstract/helpers/timeConstants.js
new file mode 100644
index 0000000..c275b40
--- /dev/null
+++ b/node_modules/es-abstract/helpers/timeConstants.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var HoursPerDay = 24;
+var MinutesPerHour = 60;
+var SecondsPerMinute = 60;
+var msPerSecond = 1e3;
+var msPerMinute = msPerSecond * SecondsPerMinute;
+var msPerHour = msPerMinute * MinutesPerHour;
+var msPerDay = 86400000;
+
+module.exports = {
+	HoursPerDay: HoursPerDay,
+	MinutesPerHour: MinutesPerHour,
+	SecondsPerMinute: SecondsPerMinute,
+	msPerSecond: msPerSecond,
+	msPerMinute: msPerMinute,
+	msPerHour: msPerHour,
+	msPerDay: msPerDay
+};
diff --git a/node_modules/es-abstract/index.js b/node_modules/es-abstract/index.js
new file mode 100644
index 0000000..5cd5292
--- /dev/null
+++ b/node_modules/es-abstract/index.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var assign = require('./helpers/assign');
+
+var ES5 = require('./es5');
+var ES2015 = require('./es2015');
+var ES2016 = require('./es2016');
+var ES2017 = require('./es2017');
+var ES2018 = require('./es2018');
+var ES2019 = require('./es2019');
+var ES2020 = require('./es2020');
+
+var ES = {
+	ES5: ES5,
+	ES6: ES2015,
+	ES2015: ES2015,
+	ES7: ES2016,
+	ES2016: ES2016,
+	ES2017: ES2017,
+	ES2018: ES2018,
+	ES2019: ES2019,
+	ES2020: ES2020
+};
+assign(ES, ES5);
+delete ES.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
+assign(ES, ES2015);
+
+module.exports = ES;
diff --git a/node_modules/es-abstract/node_modules/call-bind/.eslintignore b/node_modules/es-abstract/node_modules/call-bind/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/node_modules/es-abstract/node_modules/call-bind/.eslintrc b/node_modules/es-abstract/node_modules/call-bind/.eslintrc
new file mode 100644
index 0000000..e5d3c9a
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/.eslintrc
@@ -0,0 +1,17 @@
+{
+	"root": true,
+
+	"extends": "@ljharb",
+
+	"rules": {
+		"func-name-matching": 0,
+		"id-length": 0,
+		"new-cap": [2, {
+			"capIsNewExceptions": [
+				"GetIntrinsic",
+			],
+		}],
+		"no-magic-numbers": 0,
+		"operator-linebreak": [2, "before"],
+	},
+}
diff --git a/node_modules/es-abstract/node_modules/call-bind/.github/FUNDING.yml b/node_modules/es-abstract/node_modules/call-bind/.github/FUNDING.yml
new file mode 100644
index 0000000..c70c2ec
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/call-bind
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/es-abstract/node_modules/call-bind/.nycrc b/node_modules/es-abstract/node_modules/call-bind/.nycrc
new file mode 100644
index 0000000..1826526
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/.nycrc
@@ -0,0 +1,13 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"lines": 86,
+	"statements": 85.93,
+	"functions": 82.43,
+	"branches": 76.06,
+	"exclude": [
+		"coverage",
+		"test"
+	]
+}
diff --git a/node_modules/es-abstract/node_modules/call-bind/CHANGELOG.md b/node_modules/es-abstract/node_modules/call-bind/CHANGELOG.md
new file mode 100644
index 0000000..62a3727
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/CHANGELOG.md
@@ -0,0 +1,42 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.0.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11
+
+### Commits
+
+- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d)
+
+## [v1.0.1](https://github.com/ljharb/call-bind/compare/v1.0.0...v1.0.1) - 2021-01-08
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`b6db284`](https://github.com/ljharb/call-bind/commit/b6db284c36f8ccd195b88a6764fe84b7223a0da1)
+- [meta] do not publish github action workflow files [`ec7fe46`](https://github.com/ljharb/call-bind/commit/ec7fe46e60cfa4764ee943d2755f5e5a366e578e)
+- [Fix] preserve original function’s length when possible [`adbceaa`](https://github.com/ljharb/call-bind/commit/adbceaa3cac4b41ea78bb19d7ccdbaaf7e0bdadb)
+- [Tests] gather coverage data on every job [`d69e23c`](https://github.com/ljharb/call-bind/commit/d69e23cc65f101ba1d4c19bb07fa8eb0ec624be8)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`2fd3586`](https://github.com/ljharb/call-bind/commit/2fd3586c5d47b335364c14293114c6b625ae1f71)
+- [Deps] update `get-intrinsic` [`f23e931`](https://github.com/ljharb/call-bind/commit/f23e9318cc271c2add8bb38cfded85ee7baf8eee)
+- [Deps] update `get-intrinsic` [`72d9f44`](https://github.com/ljharb/call-bind/commit/72d9f44e184465ba8dd3fb48260bbcff234985f2)
+- [meta] fix FUNDING.yml [`e723573`](https://github.com/ljharb/call-bind/commit/e723573438c5a68dcec31fb5d96ea6b7e4a93be8)
+- [eslint] ignore coverage output [`15e76d2`](https://github.com/ljharb/call-bind/commit/15e76d28a5f43e504696401e5b31ebb78ee1b532)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`8fa4dab`](https://github.com/ljharb/call-bind/commit/8fa4dabb23ba3dd7bb92c9571c1241c08b56e4b6)
+
+## v1.0.0 - 2020-10-30
+
+### Commits
+
+- Initial commit [`306cf98`](https://github.com/ljharb/call-bind/commit/306cf98c7ec9e7ef66b653ec152277ac1381eb50)
+- Tests [`e10d0bb`](https://github.com/ljharb/call-bind/commit/e10d0bbdadc7a10ecedc9a1c035112d3e368b8df)
+- Implementation [`43852ed`](https://github.com/ljharb/call-bind/commit/43852eda0f187327b7fad2423ca972149a52bd65)
+- npm init [`408f860`](https://github.com/ljharb/call-bind/commit/408f860b773a2f610805fd3613d0d71bac1b6249)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`fb349b2`](https://github.com/ljharb/call-bind/commit/fb349b2e48defbec8b5ec8a8395cc8f69f220b13)
+- [meta] add `auto-changelog` [`c4001fc`](https://github.com/ljharb/call-bind/commit/c4001fc43031799ef908211c98d3b0fb2b60fde4)
+- [meta] add "funding"; create `FUNDING.yml` [`d4d6d29`](https://github.com/ljharb/call-bind/commit/d4d6d2974a14bc2e98830468eda7fe6d6a776717)
+- [Tests] add `npm run lint` [`dedfb98`](https://github.com/ljharb/call-bind/commit/dedfb98bd0ecefb08ddb9a94061bd10cde4332af)
+- Only apps should have lockfiles [`54ac776`](https://github.com/ljharb/call-bind/commit/54ac77653db45a7361dc153d2f478e743f110650)
+- [meta] add `safe-publish-latest` [`9ea8e43`](https://github.com/ljharb/call-bind/commit/9ea8e435b950ce9b705559cd651039f9bf40140f)
diff --git a/node_modules/es-abstract/node_modules/call-bind/LICENSE b/node_modules/es-abstract/node_modules/call-bind/LICENSE
new file mode 100644
index 0000000..48f05d0
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Jordan Harband
+
+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/es-abstract/node_modules/call-bind/README.md b/node_modules/es-abstract/node_modules/call-bind/README.md
new file mode 100644
index 0000000..53649eb
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/README.md
@@ -0,0 +1,2 @@
+# call-bind
+Robustly `.call.bind()` a function.
diff --git a/node_modules/es-abstract/node_modules/call-bind/callBound.js b/node_modules/es-abstract/node_modules/call-bind/callBound.js
new file mode 100644
index 0000000..8374adf
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/callBound.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBind = require('./');
+
+var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));
+
+module.exports = function callBoundIntrinsic(name, allowMissing) {
+	var intrinsic = GetIntrinsic(name, !!allowMissing);
+	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
+		return callBind(intrinsic);
+	}
+	return intrinsic;
+};
diff --git a/node_modules/es-abstract/node_modules/call-bind/index.js b/node_modules/es-abstract/node_modules/call-bind/index.js
new file mode 100644
index 0000000..6fa3e4a
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/index.js
@@ -0,0 +1,47 @@
+'use strict';
+
+var bind = require('function-bind');
+var GetIntrinsic = require('get-intrinsic');
+
+var $apply = GetIntrinsic('%Function.prototype.apply%');
+var $call = GetIntrinsic('%Function.prototype.call%');
+var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
+
+var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
+var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
+var $max = GetIntrinsic('%Math.max%');
+
+if ($defineProperty) {
+	try {
+		$defineProperty({}, 'a', { value: 1 });
+	} catch (e) {
+		// IE 8 has a broken defineProperty
+		$defineProperty = null;
+	}
+}
+
+module.exports = function callBind(originalFunction) {
+	var func = $reflectApply(bind, $call, arguments);
+	if ($gOPD && $defineProperty) {
+		var desc = $gOPD(func, 'length');
+		if (desc.configurable) {
+			// original length, plus the receiver, minus any additional arguments (after the receiver)
+			$defineProperty(
+				func,
+				'length',
+				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
+			);
+		}
+	}
+	return func;
+};
+
+var applyBind = function applyBind() {
+	return $reflectApply(bind, $apply, arguments);
+};
+
+if ($defineProperty) {
+	$defineProperty(module.exports, 'apply', { value: applyBind });
+} else {
+	module.exports.apply = applyBind;
+}
diff --git a/node_modules/es-abstract/node_modules/call-bind/package.json b/node_modules/es-abstract/node_modules/call-bind/package.json
new file mode 100644
index 0000000..2a4aa1b
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/package.json
@@ -0,0 +1,108 @@
+{
+  "_from": "call-bind@^1.0.2",
+  "_id": "call-bind@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+  "_location": "/es-abstract/call-bind",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "call-bind@^1.0.2",
+    "name": "call-bind",
+    "escapedName": "call-bind",
+    "rawSpec": "^1.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.2"
+  },
+  "_requiredBy": [
+    "/es-abstract"
+  ],
+  "_resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+  "_shasum": "b1d4e89e688119c3c9a903ad30abb2f6a919be3c",
+  "_spec": "call-bind@^1.0.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\es-abstract",
+  "author": {
+    "name": "Jordan Harband",
+    "email": "ljharb@gmail.com"
+  },
+  "auto-changelog": {
+    "output": "CHANGELOG.md",
+    "template": "keepachangelog",
+    "unreleased": false,
+    "commitLimit": false,
+    "backfillLimit": false,
+    "hideCredit": true
+  },
+  "bugs": {
+    "url": "https://github.com/ljharb/call-bind/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "function-bind": "^1.1.1",
+    "get-intrinsic": "^1.0.2"
+  },
+  "deprecated": false,
+  "description": "Robustly `.call.bind()` a function",
+  "devDependencies": {
+    "@ljharb/eslint-config": "^17.3.0",
+    "aud": "^1.1.3",
+    "auto-changelog": "^2.2.1",
+    "eslint": "^7.17.0",
+    "nyc": "^10.3.2",
+    "safe-publish-latest": "^1.1.4",
+    "tape": "^5.1.1"
+  },
+  "exports": {
+    ".": [
+      {
+        "default": "./index.js"
+      },
+      "./index.js"
+    ],
+    "./callBound": [
+      {
+        "default": "./callBound.js"
+      },
+      "./callBound.js"
+    ],
+    "./package.json": "./package.json"
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/ljharb"
+  },
+  "homepage": "https://github.com/ljharb/call-bind#readme",
+  "keywords": [
+    "javascript",
+    "ecmascript",
+    "es",
+    "js",
+    "callbind",
+    "callbound",
+    "call",
+    "bind",
+    "bound",
+    "call-bind",
+    "call-bound",
+    "function",
+    "es-abstract"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "call-bind",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ljharb/call-bind.git"
+  },
+  "scripts": {
+    "lint": "eslint --ext=.js,.mjs .",
+    "posttest": "aud --production",
+    "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"",
+    "prepublish": "safe-publish-latest",
+    "pretest": "npm run lint",
+    "test": "npm run tests-only",
+    "tests-only": "nyc tape 'test/*'",
+    "version": "auto-changelog && git add CHANGELOG.md"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/es-abstract/node_modules/call-bind/test/callBound.js b/node_modules/es-abstract/node_modules/call-bind/test/callBound.js
new file mode 100644
index 0000000..209ce3c
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/test/callBound.js
@@ -0,0 +1,55 @@
+'use strict';
+
+var test = require('tape');
+
+var callBound = require('../callBound');
+
+test('callBound', function (t) {
+	// static primitive
+	t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself');
+	t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself');
+
+	// static non-function object
+	t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself');
+	t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself');
+	t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself');
+	t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself');
+
+	// static function
+	t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself');
+	t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself');
+
+	// prototype primitive
+	t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself');
+	t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself');
+
+	// prototype function
+	t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself');
+	t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself');
+	t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original');
+	t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original');
+
+	t['throws'](
+		function () { callBound('does not exist'); },
+		SyntaxError,
+		'nonexistent intrinsic throws'
+	);
+	t['throws'](
+		function () { callBound('does not exist', true); },
+		SyntaxError,
+		'allowMissing arg still throws for unknown intrinsic'
+	);
+
+	/* globals WeakRef: false */
+	t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) {
+		st['throws'](
+			function () { callBound('WeakRef'); },
+			TypeError,
+			'real but absent intrinsic throws'
+		);
+		st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception');
+		st.end();
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/call-bind/test/index.js b/node_modules/es-abstract/node_modules/call-bind/test/index.js
new file mode 100644
index 0000000..bf6769c
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/call-bind/test/index.js
@@ -0,0 +1,66 @@
+'use strict';
+
+var callBind = require('../');
+var bind = require('function-bind');
+
+var test = require('tape');
+
+/*
+ * older engines have length nonconfigurable
+ * in io.js v3, it is configurable except on bound functions, hence the .bind()
+ */
+var functionsHaveConfigurableLengths = !!(
+	Object.getOwnPropertyDescriptor
+	&& Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable
+);
+
+test('callBind', function (t) {
+	var sentinel = { sentinel: true };
+	var func = function (a, b) {
+		// eslint-disable-next-line no-invalid-this
+		return [this, a, b];
+	};
+	t.equal(func.length, 2, 'original function length is 2');
+	t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args');
+	t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args');
+	t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args');
+
+	var bound = callBind(func);
+	t.equal(bound.length, func.length + 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+	t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args');
+	t.deepEqual(bound(1, 2), [1, 2, undefined], 'bound func with right args');
+	t.deepEqual(bound(1, 2, 3), [1, 2, 3], 'bound func with too many args');
+
+	var boundR = callBind(func, sentinel);
+	t.equal(boundR.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+	t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args');
+	t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args');
+	t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args');
+
+	var boundArg = callBind(func, sentinel, 1);
+	t.equal(boundArg.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+	t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args');
+	t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg');
+	t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args');
+
+	t.test('callBind.apply', function (st) {
+		var aBound = callBind.apply(func);
+		st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args');
+		st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
+		st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
+
+		var aBoundArg = callBind.apply(func);
+		st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args');
+		st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
+		st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
+
+		var aBoundR = callBind.apply(func, sentinel);
+		st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args');
+		st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args');
+		st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args');
+
+		st.end();
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/.eslintignore b/node_modules/es-abstract/node_modules/get-intrinsic/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/.eslintrc b/node_modules/es-abstract/node_modules/get-intrinsic/.eslintrc
new file mode 100644
index 0000000..d04e483
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/.eslintrc
@@ -0,0 +1,43 @@
+{
+	"root": true,
+
+	"extends": "@ljharb",
+
+	"env": {
+		"es6": true,
+		"es2017": true,
+		"es2020": true,
+		"es2021": true,
+	},
+
+	"globals": {
+		"AggregateError": false,
+	},
+
+	"rules": {
+		"array-bracket-newline": 0,
+		"array-element-newline": 0,
+		"complexity": 0,
+		"eqeqeq": [2, "allow-null"],
+		"func-name-matching": 0,
+		"id-length": 0,
+		"max-lines-per-function": [2, 80],
+		"max-params": [2, 4],
+		"max-statements": 0,
+		"max-statements-per-line": [2, { "max": 2 }],
+		"multiline-comment-style": 0,
+		"no-magic-numbers": 0,
+		"operator-linebreak": [2, "before"],
+		"sort-keys": 0,
+	},
+
+	"overrides": [
+		{
+			"files": "test/**",
+			"rules": {
+				"max-lines-per-function": 0,
+				"new-cap": 0,
+			},
+		},
+	],
+}
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/.github/FUNDING.yml b/node_modules/es-abstract/node_modules/get-intrinsic/.github/FUNDING.yml
new file mode 100644
index 0000000..8e8da0d
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/get-intrinsic
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/.nycrc b/node_modules/es-abstract/node_modules/get-intrinsic/.nycrc
new file mode 100644
index 0000000..1826526
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/.nycrc
@@ -0,0 +1,13 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"lines": 86,
+	"statements": 85.93,
+	"functions": 82.43,
+	"branches": 76.06,
+	"exclude": [
+		"coverage",
+		"test"
+	]
+}
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/CHANGELOG.md b/node_modules/es-abstract/node_modules/get-intrinsic/CHANGELOG.md
new file mode 100644
index 0000000..32502ec
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/CHANGELOG.md
@@ -0,0 +1,64 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.1.1](https://github.com/ljharb/get-intrinsic/compare/v1.1.0...v1.1.1) - 2021-02-03
+
+### Fixed
+
+- [meta] export `./package.json` [`#9`](https://github.com/ljharb/get-intrinsic/issues/9)
+
+### Commits
+
+- [readme] flesh out the readme; use `evalmd` [`d12f12c`](https://github.com/ljharb/get-intrinsic/commit/d12f12c15345a0a0772cc65a7c64369529abd614)
+- [eslint] set up proper globals config [`5a8c098`](https://github.com/ljharb/get-intrinsic/commit/5a8c0984e3319d1ac0e64b102f8ec18b64e79f36)
+- [Dev Deps] update `eslint` [`7b9a5c0`](https://github.com/ljharb/get-intrinsic/commit/7b9a5c0d31a90ca1a1234181c74988fb046701cd)
+
+## [v1.1.0](https://github.com/ljharb/get-intrinsic/compare/v1.0.2...v1.1.0) - 2021-01-25
+
+### Fixed
+
+- [Refactor] delay `Function` eval until syntax-derived values are requested [`#3`](https://github.com/ljharb/get-intrinsic/issues/3)
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`2ab762b`](https://github.com/ljharb/get-intrinsic/commit/2ab762b48164aea8af37a40ba105bbc8246ab8c4)
+- [meta] do not publish github action workflow files [`5e7108e`](https://github.com/ljharb/get-intrinsic/commit/5e7108e4768b244d48d9567ba4f8a6cab9c65b8e)
+- [Tests] add some coverage [`01ac7a8`](https://github.com/ljharb/get-intrinsic/commit/01ac7a87ac29738567e8524cd8c9e026b1fa8cb3)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `call-bind`, `es-abstract`, `tape`; add `call-bind` [`911b672`](https://github.com/ljharb/get-intrinsic/commit/911b672fbffae433a96924c6ce013585e425f4b7)
+- [Refactor] rearrange evalled constructors a bit [`7e7e4bf`](https://github.com/ljharb/get-intrinsic/commit/7e7e4bf583f3799c8ac1c6c5e10d2cb553957347)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`0199968`](https://github.com/ljharb/get-intrinsic/commit/01999687a263ffce0a3cb011dfbcb761754aedbc)
+
+## [v1.0.2](https://github.com/ljharb/get-intrinsic/compare/v1.0.1...v1.0.2) - 2020-12-17
+
+### Commits
+
+- [Fix] Throw for non‑existent intrinsics [`68f873b`](https://github.com/ljharb/get-intrinsic/commit/68f873b013c732a05ad6f5fc54f697e55515461b)
+- [Fix] Throw for non‑existent segments in the intrinsic path [`8325dee`](https://github.com/ljharb/get-intrinsic/commit/8325deee43128f3654d3399aa9591741ebe17b21)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-bigints`, `object-inspect` [`0c227a7`](https://github.com/ljharb/get-intrinsic/commit/0c227a7d8b629166f25715fd242553892e458525)
+- [meta] do not lint coverage output [`70d2419`](https://github.com/ljharb/get-intrinsic/commit/70d24199b620043cd9110fc5f426d214ebe21dc9)
+
+## [v1.0.1](https://github.com/ljharb/get-intrinsic/compare/v1.0.0...v1.0.1) - 2020-10-30
+
+### Commits
+
+- [Tests] gather coverage data on every job [`d1d280d`](https://github.com/ljharb/get-intrinsic/commit/d1d280dec714e3f0519cc877dbcb193057d9cac6)
+- [Fix] add missing dependencies [`5031771`](https://github.com/ljharb/get-intrinsic/commit/5031771bb1095b38be88ce7c41d5de88718e432e)
+- [Tests] use `es-value-fixtures` [`af48765`](https://github.com/ljharb/get-intrinsic/commit/af48765a23c5323fb0b6b38dbf00eb5099c7bebc)
+
+## v1.0.0 - 2020-10-29
+
+### Commits
+
+- Implementation [`bbce57c`](https://github.com/ljharb/get-intrinsic/commit/bbce57c6f33d05b2d8d3efa273ceeb3ee01127bb)
+- Tests [`17b4f0d`](https://github.com/ljharb/get-intrinsic/commit/17b4f0d56dea6b4059b56fc30ef3ee4d9500ebc2)
+- Initial commit [`3153294`](https://github.com/ljharb/get-intrinsic/commit/31532948de363b0a27dd9fd4649e7b7028ec4b44)
+- npm init [`fb326c4`](https://github.com/ljharb/get-intrinsic/commit/fb326c4d2817c8419ec31de1295f06bb268a7902)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`48862fb`](https://github.com/ljharb/get-intrinsic/commit/48862fb2508c8f6a57968e6d08b7c883afc9d550)
+- [meta] add `auto-changelog` [`5f28ad0`](https://github.com/ljharb/get-intrinsic/commit/5f28ad019e060a353d8028f9f2591a9cc93074a1)
+- [meta] add "funding"; create `FUNDING.yml` [`c2bbdde`](https://github.com/ljharb/get-intrinsic/commit/c2bbddeba73a875be61484ee4680b129a6d4e0a1)
+- [Tests] add `npm run lint` [`0a84b98`](https://github.com/ljharb/get-intrinsic/commit/0a84b98b22b7cf7a748666f705b0003a493c35fd)
+- Only apps should have lockfiles [`9586c75`](https://github.com/ljharb/get-intrinsic/commit/9586c75866c1ee678e4d5d4dbbdef6997e511b05)
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/LICENSE b/node_modules/es-abstract/node_modules/get-intrinsic/LICENSE
new file mode 100644
index 0000000..48f05d0
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Jordan Harband
+
+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/es-abstract/node_modules/get-intrinsic/README.md b/node_modules/es-abstract/node_modules/get-intrinsic/README.md
new file mode 100644
index 0000000..335a3b4
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/README.md
@@ -0,0 +1,65 @@
+# get-intrinsic <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+Get and robustly cache all JS language-level intrinsics at first require time.
+
+See the syntax described [in the JS spec](https://tc39.es/ecma262/#sec-well-known-intrinsic-objects) for reference.
+
+## Example
+
+```js
+var GetIntrinsic = require('get-intrinsic');
+var assert = require('assert');
+
+// static methods
+assert.equal(GetIntrinsic('%Math.pow%'), Math.pow);
+assert.equal(Math.pow(2, 3), 8);
+assert.equal(GetIntrinsic('%Math.pow%')(2, 3), 8);
+delete Math.pow;
+assert.equal(GetIntrinsic('%Math.pow%')(2, 3), 8);
+
+// instance methods
+var arr = [1];
+assert.equal(GetIntrinsic('%Array.prototype.push%'), Array.prototype.push);
+assert.deepEqual(arr, [1]);
+
+arr.push(2);
+assert.deepEqual(arr, [1, 2]);
+
+GetIntrinsic('%Array.prototype.push%').call(arr, 3);
+assert.deepEqual(arr, [1, 2, 3]);
+
+delete Array.prototype.push;
+GetIntrinsic('%Array.prototype.push%').call(arr, 4);
+assert.deepEqual(arr, [1, 2, 3, 4]);
+
+// missing features
+delete JSON.parse; // to simulate a real intrinsic that is missing in the environment
+assert.throws(() => GetIntrinsic('%JSON.parse%'));
+assert.equal(undefined, GetIntrinsic('%JSON.parse%', true));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+## Security
+
+Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
+
+[package-url]: https://npmjs.org/package/get-intrinsic
+[npm-version-svg]: http://versionbadg.es/ljharb/get-intrinsic.svg
+[deps-svg]: https://david-dm.org/ljharb/get-intrinsic.svg
+[deps-url]: https://david-dm.org/ljharb/get-intrinsic
+[dev-deps-svg]: https://david-dm.org/ljharb/get-intrinsic/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/get-intrinsic#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/get-intrinsic.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/get-intrinsic.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/get-intrinsic.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=get-intrinsic
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/index.js b/node_modules/es-abstract/node_modules/get-intrinsic/index.js
new file mode 100644
index 0000000..d6c06c2
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/index.js
@@ -0,0 +1,330 @@
+'use strict';
+
+var undefined;
+
+var $SyntaxError = SyntaxError;
+var $Function = Function;
+var $TypeError = TypeError;
+
+// eslint-disable-next-line consistent-return
+var getEvalledConstructor = function (expressionSyntax) {
+	try {
+		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
+	} catch (e) {}
+};
+
+var $gOPD = Object.getOwnPropertyDescriptor;
+if ($gOPD) {
+	try {
+		$gOPD({}, '');
+	} catch (e) {
+		$gOPD = null; // this is IE 8, which has a broken gOPD
+	}
+}
+
+var throwTypeError = function () {
+	throw new $TypeError();
+};
+var ThrowTypeError = $gOPD
+	? (function () {
+		try {
+			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
+			arguments.callee; // IE 8 does not throw here
+			return throwTypeError;
+		} catch (calleeThrows) {
+			try {
+				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
+				return $gOPD(arguments, 'callee').get;
+			} catch (gOPDthrows) {
+				return throwTypeError;
+			}
+		}
+	}())
+	: throwTypeError;
+
+var hasSymbols = require('has-symbols')();
+
+var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
+
+var needsEval = {};
+
+var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);
+
+var INTRINSICS = {
+	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
+	'%Array%': Array,
+	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
+	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
+	'%AsyncFromSyncIteratorPrototype%': undefined,
+	'%AsyncFunction%': needsEval,
+	'%AsyncGenerator%': needsEval,
+	'%AsyncGeneratorFunction%': needsEval,
+	'%AsyncIteratorPrototype%': needsEval,
+	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
+	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
+	'%Boolean%': Boolean,
+	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
+	'%Date%': Date,
+	'%decodeURI%': decodeURI,
+	'%decodeURIComponent%': decodeURIComponent,
+	'%encodeURI%': encodeURI,
+	'%encodeURIComponent%': encodeURIComponent,
+	'%Error%': Error,
+	'%eval%': eval, // eslint-disable-line no-eval
+	'%EvalError%': EvalError,
+	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
+	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
+	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
+	'%Function%': $Function,
+	'%GeneratorFunction%': needsEval,
+	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
+	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
+	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
+	'%isFinite%': isFinite,
+	'%isNaN%': isNaN,
+	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
+	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
+	'%Map%': typeof Map === 'undefined' ? undefined : Map,
+	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
+	'%Math%': Math,
+	'%Number%': Number,
+	'%Object%': Object,
+	'%parseFloat%': parseFloat,
+	'%parseInt%': parseInt,
+	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
+	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
+	'%RangeError%': RangeError,
+	'%ReferenceError%': ReferenceError,
+	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
+	'%RegExp%': RegExp,
+	'%Set%': typeof Set === 'undefined' ? undefined : Set,
+	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
+	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
+	'%String%': String,
+	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
+	'%Symbol%': hasSymbols ? Symbol : undefined,
+	'%SyntaxError%': $SyntaxError,
+	'%ThrowTypeError%': ThrowTypeError,
+	'%TypedArray%': TypedArray,
+	'%TypeError%': $TypeError,
+	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
+	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
+	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
+	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
+	'%URIError%': URIError,
+	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
+	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
+	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
+};
+
+var doEval = function doEval(name) {
+	var value;
+	if (name === '%AsyncFunction%') {
+		value = getEvalledConstructor('async function () {}');
+	} else if (name === '%GeneratorFunction%') {
+		value = getEvalledConstructor('function* () {}');
+	} else if (name === '%AsyncGeneratorFunction%') {
+		value = getEvalledConstructor('async function* () {}');
+	} else if (name === '%AsyncGenerator%') {
+		var fn = doEval('%AsyncGeneratorFunction%');
+		if (fn) {
+			value = fn.prototype;
+		}
+	} else if (name === '%AsyncIteratorPrototype%') {
+		var gen = doEval('%AsyncGenerator%');
+		if (gen) {
+			value = getProto(gen.prototype);
+		}
+	}
+
+	INTRINSICS[name] = value;
+
+	return value;
+};
+
+var LEGACY_ALIASES = {
+	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
+	'%ArrayPrototype%': ['Array', 'prototype'],
+	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
+	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
+	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
+	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
+	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
+	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
+	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
+	'%BooleanPrototype%': ['Boolean', 'prototype'],
+	'%DataViewPrototype%': ['DataView', 'prototype'],
+	'%DatePrototype%': ['Date', 'prototype'],
+	'%ErrorPrototype%': ['Error', 'prototype'],
+	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
+	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
+	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
+	'%FunctionPrototype%': ['Function', 'prototype'],
+	'%Generator%': ['GeneratorFunction', 'prototype'],
+	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
+	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
+	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
+	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
+	'%JSONParse%': ['JSON', 'parse'],
+	'%JSONStringify%': ['JSON', 'stringify'],
+	'%MapPrototype%': ['Map', 'prototype'],
+	'%NumberPrototype%': ['Number', 'prototype'],
+	'%ObjectPrototype%': ['Object', 'prototype'],
+	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
+	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
+	'%PromisePrototype%': ['Promise', 'prototype'],
+	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
+	'%Promise_all%': ['Promise', 'all'],
+	'%Promise_reject%': ['Promise', 'reject'],
+	'%Promise_resolve%': ['Promise', 'resolve'],
+	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
+	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
+	'%RegExpPrototype%': ['RegExp', 'prototype'],
+	'%SetPrototype%': ['Set', 'prototype'],
+	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
+	'%StringPrototype%': ['String', 'prototype'],
+	'%SymbolPrototype%': ['Symbol', 'prototype'],
+	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
+	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
+	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
+	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
+	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
+	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
+	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
+	'%URIErrorPrototype%': ['URIError', 'prototype'],
+	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
+	'%WeakSetPrototype%': ['WeakSet', 'prototype']
+};
+
+var bind = require('function-bind');
+var hasOwn = require('has');
+var $concat = bind.call(Function.call, Array.prototype.concat);
+var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
+var $replace = bind.call(Function.call, String.prototype.replace);
+var $strSlice = bind.call(Function.call, String.prototype.slice);
+
+/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
+var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
+var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
+var stringToPath = function stringToPath(string) {
+	var first = $strSlice(string, 0, 1);
+	var last = $strSlice(string, -1);
+	if (first === '%' && last !== '%') {
+		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
+	} else if (last === '%' && first !== '%') {
+		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
+	}
+	var result = [];
+	$replace(string, rePropName, function (match, number, quote, subString) {
+		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
+	});
+	return result;
+};
+/* end adaptation */
+
+var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
+	var intrinsicName = name;
+	var alias;
+	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
+		alias = LEGACY_ALIASES[intrinsicName];
+		intrinsicName = '%' + alias[0] + '%';
+	}
+
+	if (hasOwn(INTRINSICS, intrinsicName)) {
+		var value = INTRINSICS[intrinsicName];
+		if (value === needsEval) {
+			value = doEval(intrinsicName);
+		}
+		if (typeof value === 'undefined' && !allowMissing) {
+			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
+		}
+
+		return {
+			alias: alias,
+			name: intrinsicName,
+			value: value
+		};
+	}
+
+	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
+};
+
+module.exports = function GetIntrinsic(name, allowMissing) {
+	if (typeof name !== 'string' || name.length === 0) {
+		throw new $TypeError('intrinsic name must be a non-empty string');
+	}
+	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
+		throw new $TypeError('"allowMissing" argument must be a boolean');
+	}
+
+	var parts = stringToPath(name);
+	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';
+
+	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
+	var intrinsicRealName = intrinsic.name;
+	var value = intrinsic.value;
+	var skipFurtherCaching = false;
+
+	var alias = intrinsic.alias;
+	if (alias) {
+		intrinsicBaseName = alias[0];
+		$spliceApply(parts, $concat([0, 1], alias));
+	}
+
+	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
+		var part = parts[i];
+		var first = $strSlice(part, 0, 1);
+		var last = $strSlice(part, -1);
+		if (
+			(
+				(first === '"' || first === "'" || first === '`')
+				|| (last === '"' || last === "'" || last === '`')
+			)
+			&& first !== last
+		) {
+			throw new $SyntaxError('property names with quotes must have matching quotes');
+		}
+		if (part === 'constructor' || !isOwn) {
+			skipFurtherCaching = true;
+		}
+
+		intrinsicBaseName += '.' + part;
+		intrinsicRealName = '%' + intrinsicBaseName + '%';
+
+		if (hasOwn(INTRINSICS, intrinsicRealName)) {
+			value = INTRINSICS[intrinsicRealName];
+		} else if (value != null) {
+			if (!(part in value)) {
+				if (!allowMissing) {
+					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
+				}
+				return void undefined;
+			}
+			if ($gOPD && (i + 1) >= parts.length) {
+				var desc = $gOPD(value, part);
+				isOwn = !!desc;
+
+				// By convention, when a data property is converted to an accessor
+				// property to emulate a data property that does not suffer from
+				// the override mistake, that accessor's getter is marked with
+				// an `originalValue` property. Here, when we detect this, we
+				// uphold the illusion by pretending to see that original data
+				// property, i.e., returning the value rather than the getter
+				// itself.
+				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
+					value = desc.get;
+				} else {
+					value = value[part];
+				}
+			} else {
+				isOwn = hasOwn(value, part);
+				value = value[part];
+			}
+
+			if (isOwn && !skipFurtherCaching) {
+				INTRINSICS[intrinsicRealName] = value;
+			}
+		}
+	}
+	return value;
+};
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/package.json b/node_modules/es-abstract/node_modules/get-intrinsic/package.json
new file mode 100644
index 0000000..d2be445
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/package.json
@@ -0,0 +1,107 @@
+{
+  "_from": "get-intrinsic@^1.1.1",
+  "_id": "get-intrinsic@1.1.1",
+  "_inBundle": false,
+  "_integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+  "_location": "/es-abstract/get-intrinsic",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "get-intrinsic@^1.1.1",
+    "name": "get-intrinsic",
+    "escapedName": "get-intrinsic",
+    "rawSpec": "^1.1.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.1"
+  },
+  "_requiredBy": [
+    "/es-abstract",
+    "/es-abstract/call-bind"
+  ],
+  "_resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+  "_shasum": "15f59f376f855c446963948f0d24cd3637b4abc6",
+  "_spec": "get-intrinsic@^1.1.1",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\es-abstract",
+  "author": {
+    "name": "Jordan Harband",
+    "email": "ljharb@gmail.com"
+  },
+  "auto-changelog": {
+    "output": "CHANGELOG.md",
+    "template": "keepachangelog",
+    "unreleased": false,
+    "commitLimit": false,
+    "backfillLimit": false,
+    "hideCredit": true
+  },
+  "bugs": {
+    "url": "https://github.com/ljharb/get-intrinsic/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "function-bind": "^1.1.1",
+    "has": "^1.0.3",
+    "has-symbols": "^1.0.1"
+  },
+  "deprecated": false,
+  "description": "Get and robustly cache all JS language-level intrinsics at first require time",
+  "devDependencies": {
+    "@ljharb/eslint-config": "^17.5.0",
+    "aud": "^1.1.3",
+    "auto-changelog": "^2.2.1",
+    "call-bind": "^1.0.2",
+    "es-abstract": "^1.18.0-next.2",
+    "es-value-fixtures": "^1.0.0",
+    "eslint": "^7.19.0",
+    "evalmd": "^0.0.19",
+    "foreach": "^2.0.5",
+    "has-bigints": "^1.0.1",
+    "make-async-function": "^1.0.0",
+    "make-async-generator-function": "^1.0.0",
+    "make-generator-function": "^2.0.0",
+    "nyc": "^10.3.2",
+    "object-inspect": "^1.9.0",
+    "tape": "^5.1.1"
+  },
+  "exports": {
+    ".": [
+      {
+        "default": "./index.js"
+      },
+      "./index.js"
+    ],
+    "./package.json": "./package.json"
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/ljharb"
+  },
+  "homepage": "https://github.com/ljharb/get-intrinsic#readme",
+  "keywords": [
+    "javascript",
+    "ecmascript",
+    "es",
+    "js",
+    "intrinsic",
+    "getintrinsic",
+    "es-abstract"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "get-intrinsic",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ljharb/get-intrinsic.git"
+  },
+  "scripts": {
+    "lint": "eslint --ext=.js,.mjs .",
+    "posttest": "aud --production",
+    "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"",
+    "prelint": "evalmd README.md",
+    "pretest": "npm run lint",
+    "test": "npm run tests-only",
+    "tests-only": "nyc tape 'test/**/*.js'",
+    "version": "auto-changelog && git add CHANGELOG.md"
+  },
+  "version": "1.1.1"
+}
diff --git a/node_modules/es-abstract/node_modules/get-intrinsic/test/GetIntrinsic.js b/node_modules/es-abstract/node_modules/get-intrinsic/test/GetIntrinsic.js
new file mode 100644
index 0000000..695e3ad
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/get-intrinsic/test/GetIntrinsic.js
@@ -0,0 +1,260 @@
+'use strict';
+
+var GetIntrinsic = require('../');
+
+var test = require('tape');
+var forEach = require('foreach');
+var debug = require('object-inspect');
+var generatorFns = require('make-generator-function')();
+var asyncFns = require('make-async-function').list();
+var asyncGenFns = require('make-async-generator-function')();
+
+var callBound = require('call-bind/callBound');
+var v = require('es-value-fixtures');
+var $gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');
+var defineProperty = require('es-abstract/test/helpers/defineProperty');
+
+var $isProto = callBound('%Object.prototype.isPrototypeOf%');
+
+test('export', function (t) {
+	t.equal(typeof GetIntrinsic, 'function', 'it is a function');
+	t.equal(GetIntrinsic.length, 2, 'function has length of 2');
+
+	t.end();
+});
+
+test('throws', function (t) {
+	t['throws'](
+		function () { GetIntrinsic('not an intrinsic'); },
+		SyntaxError,
+		'nonexistent intrinsic throws a syntax error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic(''); },
+		TypeError,
+		'empty string intrinsic throws a type error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic('.'); },
+		SyntaxError,
+		'"just a dot" intrinsic throws a syntax error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic('%String'); },
+		SyntaxError,
+		'Leading % without trailing % throws a syntax error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic('String%'); },
+		SyntaxError,
+		'Trailing % without leading % throws a syntax error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic("String['prototype]"); },
+		SyntaxError,
+		'Dynamic property access is disallowed for intrinsics (unterminated string)'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic('%Proxy.prototype.undefined%'); },
+		TypeError,
+		"Throws when middle part doesn't exist (%Proxy.prototype.undefined%)"
+	);
+
+	forEach(v.nonStrings, function (nonString) {
+		t['throws'](
+			function () { GetIntrinsic(nonString); },
+			TypeError,
+			debug(nonString) + ' is not a String'
+		);
+	});
+
+	forEach(v.nonBooleans, function (nonBoolean) {
+		t['throws'](
+			function () { GetIntrinsic('%', nonBoolean); },
+			TypeError,
+			debug(nonBoolean) + ' is not a Boolean'
+		);
+	});
+
+	forEach([
+		'toString',
+		'propertyIsEnumerable',
+		'hasOwnProperty'
+	], function (objectProtoMember) {
+		t['throws'](
+			function () { GetIntrinsic(objectProtoMember); },
+			SyntaxError,
+			debug(objectProtoMember) + ' is not an intrinsic'
+		);
+	});
+
+	t.end();
+});
+
+test('base intrinsics', function (t) {
+	t.equal(GetIntrinsic('%Object%'), Object, '%Object% yields Object');
+	t.equal(GetIntrinsic('Object'), Object, 'Object yields Object');
+	t.equal(GetIntrinsic('%Array%'), Array, '%Array% yields Array');
+	t.equal(GetIntrinsic('Array'), Array, 'Array yields Array');
+
+	t.end();
+});
+
+test('dotted paths', function (t) {
+	t.equal(GetIntrinsic('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% yields Object.prototype.toString');
+	t.equal(GetIntrinsic('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString yields Object.prototype.toString');
+	t.equal(GetIntrinsic('%Array.prototype.push%'), Array.prototype.push, '%Array.prototype.push% yields Array.prototype.push');
+	t.equal(GetIntrinsic('Array.prototype.push'), Array.prototype.push, 'Array.prototype.push yields Array.prototype.push');
+
+	test('underscore paths are aliases for dotted paths', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
+		var original = GetIntrinsic('%ObjProto_toString%');
+
+		forEach([
+			'%Object.prototype.toString%',
+			'Object.prototype.toString',
+			'%ObjectPrototype.toString%',
+			'ObjectPrototype.toString',
+			'%ObjProto_toString%',
+			'ObjProto_toString'
+		], function (name) {
+			defineProperty(Object.prototype, 'toString', {
+				value: function toString() {
+					return original.apply(this, arguments);
+				}
+			});
+			st.equal(GetIntrinsic(name), original, name + ' yields original Object.prototype.toString');
+		});
+
+		defineProperty(Object.prototype, 'toString', { value: original });
+		st.end();
+	});
+
+	test('dotted paths cache', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
+		var original = GetIntrinsic('%Object.prototype.propertyIsEnumerable%');
+
+		forEach([
+			'%Object.prototype.propertyIsEnumerable%',
+			'Object.prototype.propertyIsEnumerable',
+			'%ObjectPrototype.propertyIsEnumerable%',
+			'ObjectPrototype.propertyIsEnumerable'
+		], function (name) {
+			// eslint-disable-next-line no-extend-native
+			Object.prototype.propertyIsEnumerable = function propertyIsEnumerable() {
+				return original.apply(this, arguments);
+			};
+			st.equal(GetIntrinsic(name), original, name + ' yields cached Object.prototype.propertyIsEnumerable');
+		});
+
+		// eslint-disable-next-line no-extend-native
+		Object.prototype.propertyIsEnumerable = original;
+		st.end();
+	});
+
+	test('dotted path reports correct error', function (st) {
+		st['throws'](function () {
+			GetIntrinsic('%NonExistentIntrinsic.prototype.property%');
+		}, /%NonExistentIntrinsic%/, 'The base intrinsic of %NonExistentIntrinsic.prototype.property% is %NonExistentIntrinsic%');
+
+		st['throws'](function () {
+			GetIntrinsic('%NonExistentIntrinsicPrototype.property%');
+		}, /%NonExistentIntrinsicPrototype%/, 'The base intrinsic of %NonExistentIntrinsicPrototype.property% is %NonExistentIntrinsicPrototype%');
+
+		st.end();
+	});
+
+	t.end();
+});
+
+test('accessors', { skip: !$gOPD || typeof Map !== 'function' }, function (t) {
+	var actual = $gOPD(Map.prototype, 'size');
+	t.ok(actual, 'Map.prototype.size has a descriptor');
+	t.equal(typeof actual.get, 'function', 'Map.prototype.size has a getter function');
+	t.equal(GetIntrinsic('%Map.prototype.size%'), actual.get, '%Map.prototype.size% yields the getter for it');
+	t.equal(GetIntrinsic('Map.prototype.size'), actual.get, 'Map.prototype.size yields the getter for it');
+
+	t.end();
+});
+
+test('generator functions', { skip: !generatorFns.length }, function (t) {
+	var $GeneratorFunction = GetIntrinsic('%GeneratorFunction%');
+	var $GeneratorFunctionPrototype = GetIntrinsic('%Generator%');
+	var $GeneratorPrototype = GetIntrinsic('%GeneratorPrototype%');
+
+	forEach(generatorFns, function (genFn) {
+		var fnName = genFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'genFn';
+
+		t.ok(genFn instanceof $GeneratorFunction, fnName + ' instanceof %GeneratorFunction%');
+		t.ok($isProto($GeneratorFunctionPrototype, genFn), '%Generator% is prototype of ' + fnName);
+		t.ok($isProto($GeneratorPrototype, genFn.prototype), '%GeneratorPrototype% is prototype of ' + fnName + '.prototype');
+	});
+
+	t.end();
+});
+
+test('async functions', { skip: !asyncFns.length }, function (t) {
+	var $AsyncFunction = GetIntrinsic('%AsyncFunction%');
+	var $AsyncFunctionPrototype = GetIntrinsic('%AsyncFunctionPrototype%');
+
+	forEach(asyncFns, function (asyncFn) {
+		var fnName = asyncFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'asyncFn';
+
+		t.ok(asyncFn instanceof $AsyncFunction, fnName + ' instanceof %AsyncFunction%');
+		t.ok($isProto($AsyncFunctionPrototype, asyncFn), '%AsyncFunctionPrototype% is prototype of ' + fnName);
+	});
+
+	t.end();
+});
+
+test('async generator functions', { skip: asyncGenFns.length === 0 }, function (t) {
+	var $AsyncGeneratorFunction = GetIntrinsic('%AsyncGeneratorFunction%');
+	var $AsyncGeneratorFunctionPrototype = GetIntrinsic('%AsyncGenerator%');
+	var $AsyncGeneratorPrototype = GetIntrinsic('%AsyncGeneratorPrototype%');
+
+	forEach(asyncGenFns, function (asyncGenFn) {
+		var fnName = asyncGenFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'asyncGenFn';
+
+		t.ok(asyncGenFn instanceof $AsyncGeneratorFunction, fnName + ' instanceof %AsyncGeneratorFunction%');
+		t.ok($isProto($AsyncGeneratorFunctionPrototype, asyncGenFn), '%AsyncGenerator% is prototype of ' + fnName);
+		t.ok($isProto($AsyncGeneratorPrototype, asyncGenFn.prototype), '%AsyncGeneratorPrototype% is prototype of ' + fnName + '.prototype');
+	});
+
+	t.end();
+});
+
+test('%ThrowTypeError%', function (t) {
+	var $ThrowTypeError = GetIntrinsic('%ThrowTypeError%');
+
+	t.equal(typeof $ThrowTypeError, 'function', 'is a function');
+	t['throws'](
+		$ThrowTypeError,
+		TypeError,
+		'%ThrowTypeError% throws a TypeError'
+	);
+
+	t.end();
+});
+
+test('allowMissing', { skip: asyncGenFns.length > 0 }, function (t) {
+	t['throws'](
+		function () { GetIntrinsic('%AsyncGeneratorPrototype%'); },
+		TypeError,
+		'throws when missing'
+	);
+
+	t.equal(
+		GetIntrinsic('%AsyncGeneratorPrototype%', true),
+		undefined,
+		'does not throw when allowMissing'
+	);
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/has-symbols/.eslintignore b/node_modules/es-abstract/node_modules/has-symbols/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/node_modules/es-abstract/node_modules/has-symbols/.eslintrc b/node_modules/es-abstract/node_modules/has-symbols/.eslintrc
new file mode 100644
index 0000000..2d9a66a
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/.eslintrc
@@ -0,0 +1,11 @@
+{
+	"root": true,
+
+	"extends": "@ljharb",
+
+	"rules": {
+		"max-statements-per-line": [2, { "max": 2 }],
+		"no-magic-numbers": 0,
+		"multiline-comment-style": 0,
+	}
+}
diff --git a/node_modules/es-abstract/node_modules/has-symbols/.github/FUNDING.yml b/node_modules/es-abstract/node_modules/has-symbols/.github/FUNDING.yml
new file mode 100644
index 0000000..04cf87e
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/has-symbols
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/es-abstract/node_modules/has-symbols/.nycrc b/node_modules/es-abstract/node_modules/has-symbols/.nycrc
new file mode 100644
index 0000000..1826526
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/.nycrc
@@ -0,0 +1,13 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"lines": 86,
+	"statements": 85.93,
+	"functions": 82.43,
+	"branches": 76.06,
+	"exclude": [
+		"coverage",
+		"test"
+	]
+}
diff --git a/node_modules/es-abstract/node_modules/has-symbols/CHANGELOG.md b/node_modules/es-abstract/node_modules/has-symbols/CHANGELOG.md
new file mode 100644
index 0000000..852ca04
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/CHANGELOG.md
@@ -0,0 +1,58 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.0.2](https://github.com/inspect-js/has-symbols/compare/v1.0.1...v1.0.2) - 2021-02-27
+
+### Fixed
+
+- [Fix] use a universal way to get the original Symbol [`#11`](https://github.com/inspect-js/has-symbols/issues/11)
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`90ae798`](https://github.com/inspect-js/has-symbols/commit/90ae79820bdfe7bc703d67f5f3c5e205f98556d3)
+- [meta] do not publish github action workflow files [`29e60a1`](https://github.com/inspect-js/has-symbols/commit/29e60a1b7c25c7f1acf7acff4a9320d0d10c49b4)
+- [Tests] run `nyc` on all tests [`8476b91`](https://github.com/inspect-js/has-symbols/commit/8476b915650d360915abe2522505abf4b0e8f0ae)
+- [readme] fix repo URLs, remove defunct badges [`126288e`](https://github.com/inspect-js/has-symbols/commit/126288ecc1797c0a40247a6b78bcb2e0bc5d7036)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `core-js`, `get-own-property-symbols` [`d84bdfa`](https://github.com/inspect-js/has-symbols/commit/d84bdfa48ac5188abbb4904b42614cd6c030940a)
+- [Tests] fix linting errors [`0df3070`](https://github.com/inspect-js/has-symbols/commit/0df3070b981b6c9f2ee530c09189a7f5c6def839)
+- [actions] add "Allow Edits" workflow [`1e6bc29`](https://github.com/inspect-js/has-symbols/commit/1e6bc29b188f32b9648657b07eda08504be5aa9c)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`36cea2a`](https://github.com/inspect-js/has-symbols/commit/36cea2addd4e6ec435f35a2656b4e9ef82498e9b)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`1278338`](https://github.com/inspect-js/has-symbols/commit/127833801865fbc2cc8979beb9ca869c7bfe8222)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`1493254`](https://github.com/inspect-js/has-symbols/commit/1493254eda13db5fb8fc5e4a3e8324b3d196029d)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js` [`b090bf2`](https://github.com/inspect-js/has-symbols/commit/b090bf214d3679a30edc1e2d729d466ab5183e1d)
+- [actions] switch Automatic Rebase workflow to `pull_request_target` event [`4addb7a`](https://github.com/inspect-js/has-symbols/commit/4addb7ab4dc73f927ae99928d68817554fc21dc0)
+- [Dev Deps] update `auto-changelog`, `tape` [`81d0baf`](https://github.com/inspect-js/has-symbols/commit/81d0baf3816096a89a8558e8043895f7a7d10d8b)
+- [Dev Deps] update `auto-changelog`; add `aud` [`1a4e561`](https://github.com/inspect-js/has-symbols/commit/1a4e5612c25d91c3a03d509721d02630bc4fe3da)
+- [readme] remove unused testling URLs [`3000941`](https://github.com/inspect-js/has-symbols/commit/3000941f958046e923ed8152edb1ef4a599e6fcc)
+- [Tests] only audit prod deps [`692e974`](https://github.com/inspect-js/has-symbols/commit/692e9743c912410e9440207631a643a34b4741a1)
+- [Dev Deps] update `@ljharb/eslint-config` [`51c946c`](https://github.com/inspect-js/has-symbols/commit/51c946c7f6baa793ec5390bb5a45cdce16b4ba76)
+
+## [v1.0.1](https://github.com/inspect-js/has-symbols/compare/v1.0.0...v1.0.1) - 2019-11-16
+
+### Commits
+
+- [Tests] use shared travis-ci configs [`ce396c9`](https://github.com/inspect-js/has-symbols/commit/ce396c9419ff11c43d0da5d05cdbb79f7fb42229)
+- [Tests] up to `node` `v12.4`, `v11.15`, `v10.15`, `v9.11`, `v8.15`, `v7.10`, `v6.17`, `v4.9`; use `nvm install-latest-npm` [`0690732`](https://github.com/inspect-js/has-symbols/commit/0690732801f47ab429f39ba1962f522d5c462d6b)
+- [meta] add `auto-changelog` [`2163d0b`](https://github.com/inspect-js/has-symbols/commit/2163d0b7f36343076b8f947cd1667dd1750f26fc)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape` [`8e0951f`](https://github.com/inspect-js/has-symbols/commit/8e0951f1a7a2e52068222b7bb73511761e6e4d9c)
+- [actions] add automatic rebasing / merge commit blocking [`b09cdb7`](https://github.com/inspect-js/has-symbols/commit/b09cdb7cd7ee39e7a769878f56e2d6066f5ccd1d)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `core-js`, `get-own-property-symbols`, `tape` [`1dd42cd`](https://github.com/inspect-js/has-symbols/commit/1dd42cd86183ed0c50f99b1062345c458babca91)
+- [meta] create FUNDING.yml [`aa57a17`](https://github.com/inspect-js/has-symbols/commit/aa57a17b19708906d1927f821ea8e73394d84ca4)
+- Only apps should have lockfiles [`a2d8bea`](https://github.com/inspect-js/has-symbols/commit/a2d8bea23a97d15c09eaf60f5b107fcf9a4d57aa)
+- [Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops [`9e96cb7`](https://github.com/inspect-js/has-symbols/commit/9e96cb783746cbed0c10ef78e599a8eaa7ebe193)
+- [meta] add `funding` field [`a0b32cf`](https://github.com/inspect-js/has-symbols/commit/a0b32cf68e803f963c1639b6d47b0a9d6440bab0)
+- [Dev Deps] update `safe-publish-latest` [`cb9f0a5`](https://github.com/inspect-js/has-symbols/commit/cb9f0a521a3a1790f1064d437edd33bb6c3d6af0)
+
+## v1.0.0 - 2016-09-19
+
+### Commits
+
+- Tests. [`ecb6eb9`](https://github.com/inspect-js/has-symbols/commit/ecb6eb934e4883137f3f93b965ba5e0a98df430d)
+- package.json [`88a337c`](https://github.com/inspect-js/has-symbols/commit/88a337cee0864a0da35f5d19e69ff0ef0150e46a)
+- Initial commit [`42e1e55`](https://github.com/inspect-js/has-symbols/commit/42e1e5502536a2b8ac529c9443984acd14836b1c)
+- Initial implementation. [`33f5cc6`](https://github.com/inspect-js/has-symbols/commit/33f5cc6cdff86e2194b081ee842bfdc63caf43fb)
+- read me [`01f1170`](https://github.com/inspect-js/has-symbols/commit/01f1170188ff7cb1558aa297f6ba5b516c6d7b0c)
diff --git a/node_modules/es-abstract/node_modules/has-symbols/LICENSE b/node_modules/es-abstract/node_modules/has-symbols/LICENSE
new file mode 100644
index 0000000..df31cbf
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Jordan Harband
+
+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/es-abstract/node_modules/has-symbols/README.md b/node_modules/es-abstract/node_modules/has-symbols/README.md
new file mode 100644
index 0000000..3875d7e
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/README.md
@@ -0,0 +1,40 @@
+# has-symbols <sup>[![Version Badge][2]][1]</sup>
+
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+Determine if the JS environment has Symbol support. Supports spec, or shams.
+
+## Example
+
+```js
+var hasSymbols = require('has-symbols');
+
+hasSymbols() === true; // if the environment has native Symbol support. Not polyfillable, not forgeable.
+
+var hasSymbolsKinda = require('has-symbols/shams');
+hasSymbolsKinda() === true; // if the environment has a Symbol sham that mostly follows the spec.
+```
+
+## Supported Symbol shams
+ - get-own-property-symbols [npm](https://www.npmjs.com/package/get-own-property-symbols) | [github](https://github.com/WebReflection/get-own-property-symbols)
+ - core-js [npm](https://www.npmjs.com/package/core-js) | [github](https://github.com/zloirock/core-js)
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/has-symbols
+[2]: https://versionbadg.es/inspect-js/has-symbols.svg
+[5]: https://david-dm.org/inspect-js/has-symbols.svg
+[6]: https://david-dm.org/inspect-js/has-symbols
+[7]: https://david-dm.org/inspect-js/has-symbols/dev-status.svg
+[8]: https://david-dm.org/inspect-js/has-symbols#info=devDependencies
+[11]: https://nodei.co/npm/has-symbols.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/has-symbols.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/has-symbols.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=has-symbols
diff --git a/node_modules/es-abstract/node_modules/has-symbols/index.js b/node_modules/es-abstract/node_modules/has-symbols/index.js
new file mode 100644
index 0000000..17044fa
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/index.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var origSymbol = typeof Symbol !== 'undefined' && Symbol;
+var hasSymbolSham = require('./shams');
+
+module.exports = function hasNativeSymbols() {
+	if (typeof origSymbol !== 'function') { return false; }
+	if (typeof Symbol !== 'function') { return false; }
+	if (typeof origSymbol('foo') !== 'symbol') { return false; }
+	if (typeof Symbol('bar') !== 'symbol') { return false; }
+
+	return hasSymbolSham();
+};
diff --git a/node_modules/es-abstract/node_modules/has-symbols/package.json b/node_modules/es-abstract/node_modules/has-symbols/package.json
new file mode 100644
index 0000000..b86b6d4
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/package.json
@@ -0,0 +1,126 @@
+{
+  "_from": "has-symbols@^1.0.2",
+  "_id": "has-symbols@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+  "_location": "/es-abstract/has-symbols",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "has-symbols@^1.0.2",
+    "name": "has-symbols",
+    "escapedName": "has-symbols",
+    "rawSpec": "^1.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.2"
+  },
+  "_requiredBy": [
+    "/es-abstract",
+    "/es-abstract/get-intrinsic"
+  ],
+  "_resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+  "_shasum": "165d3070c00309752a1236a479331e3ac56f1423",
+  "_spec": "has-symbols@^1.0.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\es-abstract",
+  "author": {
+    "name": "Jordan Harband",
+    "email": "ljharb@gmail.com",
+    "url": "http://ljharb.codes"
+  },
+  "auto-changelog": {
+    "output": "CHANGELOG.md",
+    "template": "keepachangelog",
+    "unreleased": false,
+    "commitLimit": false,
+    "backfillLimit": false,
+    "hideCredit": true
+  },
+  "bugs": {
+    "url": "https://github.com/inspect-js/has-symbols/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Jordan Harband",
+      "email": "ljharb@gmail.com",
+      "url": "http://ljharb.codes"
+    }
+  ],
+  "deprecated": false,
+  "description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
+  "devDependencies": {
+    "@ljharb/eslint-config": "^17.5.1",
+    "aud": "^1.1.4",
+    "auto-changelog": "^2.2.1",
+    "core-js": "^2.6.12",
+    "eslint": "^7.20.0",
+    "get-own-property-symbols": "^0.9.5",
+    "nyc": "^10.3.2",
+    "safe-publish-latest": "^1.1.4",
+    "tape": "^5.2.0"
+  },
+  "engines": {
+    "node": ">= 0.4"
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/ljharb"
+  },
+  "greenkeeper": {
+    "ignore": [
+      "core-js"
+    ]
+  },
+  "homepage": "https://github.com/inspect-js/has-symbols#readme",
+  "keywords": [
+    "Symbol",
+    "symbols",
+    "typeof",
+    "sham",
+    "polyfill",
+    "native",
+    "core-js",
+    "ES6"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "has-symbols",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/inspect-js/has-symbols.git"
+  },
+  "scripts": {
+    "lint": "eslint --ext=js,mjs .",
+    "posttest": "aud --production",
+    "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"",
+    "prepublish": "safe-publish-latest",
+    "pretest": "npm run --silent lint",
+    "test": "npm run tests-only",
+    "test:shams": "npm run --silent test:shams:getownpropertysymbols && npm run --silent test:shams:corejs",
+    "test:shams:corejs": "nyc node test/shams/core-js.js",
+    "test:shams:getownpropertysymbols": "nyc node test/shams/get-own-property-symbols.js",
+    "test:staging": "nyc node --harmony --es-staging test",
+    "test:stock": "nyc node test",
+    "tests-only": "npm run test:stock && npm run test:staging && npm run test:shams",
+    "version": "auto-changelog && git add CHANGELOG.md"
+  },
+  "testling": {
+    "files": "test/index.js",
+    "browsers": [
+      "iexplore/6.0..latest",
+      "firefox/3.0..6.0",
+      "firefox/15.0..latest",
+      "firefox/nightly",
+      "chrome/4.0..10.0",
+      "chrome/20.0..latest",
+      "chrome/canary",
+      "opera/10.0..latest",
+      "opera/next",
+      "safari/4.0..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2"
+    ]
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/es-abstract/node_modules/has-symbols/shams.js b/node_modules/es-abstract/node_modules/has-symbols/shams.js
new file mode 100644
index 0000000..1285210
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/shams.js
@@ -0,0 +1,42 @@
+'use strict';
+
+/* eslint complexity: [2, 18], max-statements: [2, 33] */
+module.exports = function hasSymbols() {
+	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
+	if (typeof Symbol.iterator === 'symbol') { return true; }
+
+	var obj = {};
+	var sym = Symbol('test');
+	var symObj = Object(sym);
+	if (typeof sym === 'string') { return false; }
+
+	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
+	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
+
+	// temp disabled per https://github.com/ljharb/object.assign/issues/17
+	// if (sym instanceof Symbol) { return false; }
+	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
+	// if (!(symObj instanceof Symbol)) { return false; }
+
+	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
+	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
+
+	var symVal = 42;
+	obj[sym] = symVal;
+	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
+	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
+
+	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
+
+	var syms = Object.getOwnPropertySymbols(obj);
+	if (syms.length !== 1 || syms[0] !== sym) { return false; }
+
+	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
+
+	if (typeof Object.getOwnPropertyDescriptor === 'function') {
+		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
+		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
+	}
+
+	return true;
+};
diff --git a/node_modules/es-abstract/node_modules/has-symbols/test/index.js b/node_modules/es-abstract/node_modules/has-symbols/test/index.js
new file mode 100644
index 0000000..352129c
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/test/index.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var test = require('tape');
+var hasSymbols = require('../');
+var runSymbolTests = require('./tests');
+
+test('interface', function (t) {
+	t.equal(typeof hasSymbols, 'function', 'is a function');
+	t.equal(typeof hasSymbols(), 'boolean', 'returns a boolean');
+	t.end();
+});
+
+test('Symbols are supported', { skip: !hasSymbols() }, function (t) {
+	runSymbolTests(t);
+	t.end();
+});
+
+test('Symbols are not supported', { skip: hasSymbols() }, function (t) {
+	t.equal(typeof Symbol, 'undefined', 'global Symbol is undefined');
+	t.equal(typeof Object.getOwnPropertySymbols, 'undefined', 'Object.getOwnPropertySymbols does not exist');
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/has-symbols/test/shams/core-js.js b/node_modules/es-abstract/node_modules/has-symbols/test/shams/core-js.js
new file mode 100644
index 0000000..df5365c
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/test/shams/core-js.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var test = require('tape');
+
+if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
+	test('has native Symbol support', function (t) {
+		t.equal(typeof Symbol, 'function');
+		t.equal(typeof Symbol(), 'symbol');
+		t.end();
+	});
+	return;
+}
+
+var hasSymbols = require('../../shams');
+
+test('polyfilled Symbols', function (t) {
+	/* eslint-disable global-require */
+	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
+	require('core-js/fn/symbol');
+	require('core-js/fn/symbol/to-string-tag');
+
+	require('../tests')(t);
+
+	var hasSymbolsAfter = hasSymbols();
+	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
+	/* eslint-enable global-require */
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/has-symbols/test/shams/get-own-property-symbols.js b/node_modules/es-abstract/node_modules/has-symbols/test/shams/get-own-property-symbols.js
new file mode 100644
index 0000000..9191b24
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/test/shams/get-own-property-symbols.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var test = require('tape');
+
+if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
+	test('has native Symbol support', function (t) {
+		t.equal(typeof Symbol, 'function');
+		t.equal(typeof Symbol(), 'symbol');
+		t.end();
+	});
+	return;
+}
+
+var hasSymbols = require('../../shams');
+
+test('polyfilled Symbols', function (t) {
+	/* eslint-disable global-require */
+	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
+
+	require('get-own-property-symbols');
+
+	require('../tests')(t);
+
+	var hasSymbolsAfter = hasSymbols();
+	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
+	/* eslint-enable global-require */
+	t.end();
+});
diff --git a/node_modules/es-abstract/node_modules/has-symbols/test/tests.js b/node_modules/es-abstract/node_modules/has-symbols/test/tests.js
new file mode 100644
index 0000000..89edd12
--- /dev/null
+++ b/node_modules/es-abstract/node_modules/has-symbols/test/tests.js
@@ -0,0 +1,56 @@
+'use strict';
+
+// eslint-disable-next-line consistent-return
+module.exports = function runSymbolTests(t) {
+	t.equal(typeof Symbol, 'function', 'global Symbol is a function');
+
+	if (typeof Symbol !== 'function') { return false; }
+
+	t.notEqual(Symbol(), Symbol(), 'two symbols are not equal');
+
+	/*
+	t.equal(
+		Symbol.prototype.toString.call(Symbol('foo')),
+		Symbol.prototype.toString.call(Symbol('foo')),
+		'two symbols with the same description stringify the same'
+	);
+	*/
+
+	/*
+	var foo = Symbol('foo');
+
+	t.notEqual(
+		String(foo),
+		String(Symbol('bar')),
+		'two symbols with different descriptions do not stringify the same'
+	);
+	*/
+
+	t.equal(typeof Symbol.prototype.toString, 'function', 'Symbol#toString is a function');
+	// t.equal(String(foo), Symbol.prototype.toString.call(foo), 'Symbol#toString equals String of the same symbol');
+
+	t.equal(typeof Object.getOwnPropertySymbols, 'function', 'Object.getOwnPropertySymbols is a function');
+
+	var obj = {};
+	var sym = Symbol('test');
+	var symObj = Object(sym);
+	t.notEqual(typeof sym, 'string', 'Symbol is not a string');
+	t.equal(Object.prototype.toString.call(sym), '[object Symbol]', 'symbol primitive Object#toStrings properly');
+	t.equal(Object.prototype.toString.call(symObj), '[object Symbol]', 'symbol primitive Object#toStrings properly');
+
+	var symVal = 42;
+	obj[sym] = symVal;
+	// eslint-disable-next-line no-restricted-syntax
+	for (sym in obj) { t.fail('symbol property key was found in for..in of object'); }
+
+	t.deepEqual(Object.keys(obj), [], 'no enumerable own keys on symbol-valued object');
+	t.deepEqual(Object.getOwnPropertyNames(obj), [], 'no own names on symbol-valued object');
+	t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'one own symbol on symbol-valued object');
+	t.equal(Object.prototype.propertyIsEnumerable.call(obj, sym), true, 'symbol is enumerable');
+	t.deepEqual(Object.getOwnPropertyDescriptor(obj, sym), {
+		configurable: true,
+		enumerable: true,
+		value: 42,
+		writable: true
+	}, 'property descriptor is correct');
+};
diff --git a/node_modules/es-abstract/operations/.eslintrc b/node_modules/es-abstract/operations/.eslintrc
new file mode 100644
index 0000000..bcd76f7
--- /dev/null
+++ b/node_modules/es-abstract/operations/.eslintrc
@@ -0,0 +1,5 @@
+{
+	"rules": {
+		"id-length": 0,
+	},
+}
diff --git a/node_modules/es-abstract/operations/2015.js b/node_modules/es-abstract/operations/2015.js
new file mode 100644
index 0000000..7607ef4
--- /dev/null
+++ b/node_modules/es-abstract/operations/2015.js
@@ -0,0 +1,251 @@
+'use strict';
+
+module.exports = {
+	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op
+
+	abs: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/6.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/6.0/#sec-abstract-relational-comparison',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/6.0/#sec-addrestrictedfunctionproperties',
+	AdvanceStringIndex: 'https://262.ecma-international.org/6.0/#sec-advancestringindex',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/6.0/#sec-allocatearraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/6.0/#sec-allocatetypedarray',
+	ArrayCreate: 'https://262.ecma-international.org/6.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/6.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/6.0/#sec-arrayspeciescreate',
+	BoundFunctionCreate: 'https://262.ecma-international.org/6.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/6.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/6.0/#sec-canonicalnumericindexstring',
+	CharacterRange: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/6.0/#sec-clonearraybuffer',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/6.0/#sec-implicit-completion-values',
+	Construct: 'https://262.ecma-international.org/6.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/6.0/#sec-copydatablockbytes',
+	CreateArrayFromList: 'https://262.ecma-international.org/6.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/6.0/#sec-createarrayiterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/6.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/6.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/6.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/6.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/6.0/#sec-createdynamicfunction',
+	CreateHTML: 'https://262.ecma-international.org/6.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/6.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/6.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/6.0/#sec-createlistfromarraylike',
+	CreateListIterator: 'https://262.ecma-international.org/6.0/#sec-createlistiterator',
+	CreateMapIterator: 'https://262.ecma-international.org/6.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/6.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/6.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/6.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/6.0/#sec-createrealm',
+	CreateSetIterator: 'https://262.ecma-international.org/6.0/#sec-createsetiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/6.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/6.0/#sec-date-number',
+	Day: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day',
+	DayFromYear: 'https://262.ecma-international.org/6.0/#sec-year-number',
+	DaylightSavingTA: 'https://262.ecma-international.org/6.0/#sec-daylight-saving-time-adjustment',
+	DaysInYear: 'https://262.ecma-international.org/6.0/#sec-year-number',
+	DayWithinYear: 'https://262.ecma-international.org/6.0/#sec-month-number',
+	Decode: 'https://262.ecma-international.org/6.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/6.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/6.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/6.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/6.0/#sec-encode',
+	EnqueueJob: 'https://262.ecma-international.org/6.0/#sec-enqueuejob',
+	EnumerableOwnNames: 'https://262.ecma-international.org/6.0/#sec-enumerableownnames',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/6.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/6.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/6.0/#sec-evaluatecall',
+	EvaluateDirectCall: 'https://262.ecma-international.org/6.0/#sec-evaluatedirectcall',
+	EvaluateNew: 'https://262.ecma-international.org/6.0/#sec-evaluatenew',
+	floor: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	ForBodyEvaluation: 'https://262.ecma-international.org/6.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/6.0/#sec-fulfillpromise',
+	FunctionAllocate: 'https://262.ecma-international.org/6.0/#sec-functionallocate',
+	FunctionCreate: 'https://262.ecma-international.org/6.0/#sec-functioncreate',
+	FunctionInitialize: 'https://262.ecma-international.org/6.0/#sec-functioninitialize',
+	GeneratorFunctionCreate: 'https://262.ecma-international.org/6.0/#sec-generatorfunctioncreate',
+	GeneratorResume: 'https://262.ecma-international.org/6.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/6.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/6.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/6.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/6.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/6.0/#sec-get-o-p',
+	GetBase: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	GetFunctionRealm: 'https://262.ecma-international.org/6.0/#sec-getfunctionrealm',
+	GetGlobalObject: 'https://262.ecma-international.org/6.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/6.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/6.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/6.0/#sec-getmethod',
+	GetModuleNamespace: 'https://262.ecma-international.org/6.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/6.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/6.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/6.0/#sec-getprototypefromconstructor',
+	GetReferencedName: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	GetSubstitution: 'https://262.ecma-international.org/6.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/6.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/6.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/6.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/6.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/6.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/6.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/6.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/6.0/#sec-getviewvalue',
+	HasOwnProperty: 'https://262.ecma-international.org/6.0/#sec-hasownproperty',
+	HasPrimitiveBase: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	HasProperty: 'https://262.ecma-international.org/6.0/#sec-hasproperty',
+	HostResolveImportedModule: 'sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds',
+	ImportedLocalNames: 'https://262.ecma-international.org/6.0/#sec-importedlocalnames',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/6.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/6.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/6.0/#sec-year-number',
+	InstanceofOperator: 'https://262.ecma-international.org/6.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/6.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/6.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/6.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/6.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/6.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/6.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/6.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/6.0/#sec-isarray',
+	IsCallable: 'https://262.ecma-international.org/6.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/6.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/6.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/6.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/6.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/6.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/6.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/6.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/6.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/6.0/#sec-islabelledfunction',
+	IsPromise: 'https://262.ecma-international.org/6.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/6.0/#sec-ispropertykey',
+	IsPropertyReference: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	IsRegExp: 'https://262.ecma-international.org/6.0/#sec-isregexp',
+	IsStrictReference: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	IsSuperReference: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	IsUnresolvableReference: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues',
+	IsWordChar: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IteratorClose: 'https://262.ecma-international.org/6.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/6.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/6.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/6.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/6.0/#sec-iteratorvalue',
+	LocalTime: 'https://262.ecma-international.org/6.0/#sec-localtime',
+	LoopContinues: 'https://262.ecma-international.org/6.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/6.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/6.0/#sec-makeargsetter',
+	MakeClassConstructor: 'https://262.ecma-international.org/6.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/6.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/6.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/6.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/6.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/6.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/6.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	min: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	MinFromTime: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/6.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	MonthFromTime: 'https://262.ecma-international.org/6.0/#sec-month-number',
+	msFromTime: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds',
+	msPerDay: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/6.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/6.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/6.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/6.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/6.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/6.0/#sec-newpromisecapability',
+	NormalCompletion: 'https://262.ecma-international.org/6.0/#sec-normalcompletion',
+	ObjectCreate: 'https://262.ecma-international.org/6.0/#sec-objectcreate',
+	ObjectDefineProperties: 'https://262.ecma-international.org/6.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/6.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/6.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/6.0/#sec-ordinarydefineownproperty',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/6.0/#sec-ordinarygetownproperty',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/6.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/6.0/#sec-ordinaryhasproperty',
+	ParseModule: 'https://262.ecma-international.org/6.0/#sec-parsemodule',
+	PerformEval: 'https://262.ecma-international.org/6.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/6.0/#sec-performpromiseall',
+	PerformPromiseRace: 'https://262.ecma-international.org/6.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/6.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/6.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/6.0/#sec-preparefortailcall',
+	ProxyCreate: 'https://262.ecma-international.org/6.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/6.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/6.0/#sec-quotejsonstring',
+	RegExpAlloc: 'https://262.ecma-international.org/6.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/6.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/6.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/6.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/6.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/6.0/#sec-rejectpromise',
+	RepeatMatcher: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireObjectCoercible: 'https://262.ecma-international.org/6.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/6.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/6.0/#sec-resolvethisbinding',
+	SameValue: 'https://262.ecma-international.org/6.0/#sec-samevalue',
+	SameValueZero: 'https://262.ecma-international.org/6.0/#sec-samevaluezero',
+	SecFromTime: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds',
+	SerializeJSONArray: 'https://262.ecma-international.org/6.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/6.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/6.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/6.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/6.0/#sec-setdefaultglobalbindings',
+	SetFunctionName: 'https://262.ecma-international.org/6.0/#sec-setfunctionname',
+	SetIntegrityLevel: 'https://262.ecma-international.org/6.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/6.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/6.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/6.0/#sec-setviewvalue',
+	sign: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions',
+	SortCompare: 'https://262.ecma-international.org/6.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/6.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/6.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/6.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/6.0/#sec-stringcreate',
+	StringGetIndexProperty: 'https://262.ecma-international.org/6.0/#sec-stringgetindexproperty',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/6.0/#sec-symboldescriptivestring',
+	TestIntegrityLevel: 'https://262.ecma-international.org/6.0/#sec-testintegritylevel',
+	thisBooleanValue: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-boolean-prototype-object',
+	thisNumberValue: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-number-prototype-object',
+	thisStringValue: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-string-prototype-object',
+	thisTimeValue: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-date-prototype-object',
+	TimeClip: 'https://262.ecma-international.org/6.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/6.0/#sec-year-number',
+	TimeWithinDay: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day',
+	ToBoolean: 'https://262.ecma-international.org/6.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/6.0/#sec-todatestring',
+	ToInt16: 'https://262.ecma-international.org/6.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/6.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/6.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/6.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/6.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/6.0/#sec-tonumber',
+	ToObject: 'https://262.ecma-international.org/6.0/#sec-toobject',
+	ToPrimitive: 'https://262.ecma-international.org/6.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/6.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/6.0/#sec-tostring',
+	ToUint16: 'https://262.ecma-international.org/6.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/6.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/6.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/6.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/6.0/#sec-triggerpromisereactions',
+	Type: 'https://262.ecma-international.org/6.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayFrom: 'https://262.ecma-international.org/6.0/#sec-typedarrayfrom',
+	UpdateEmpty: 'https://262.ecma-international.org/6.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/6.0/#sec-utc-t',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-validateandapplypropertydescriptor',
+	WeekDay: 'https://262.ecma-international.org/6.0/#sec-week-day',
+	YearFromTime: 'https://262.ecma-international.org/6.0/#sec-year-number'
+};
diff --git a/node_modules/es-abstract/operations/2016.js b/node_modules/es-abstract/operations/2016.js
new file mode 100644
index 0000000..3cfd8e7
--- /dev/null
+++ b/node_modules/es-abstract/operations/2016.js
@@ -0,0 +1,277 @@
+'use strict';
+
+module.exports = {
+	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op
+
+	abs: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/7.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/7.0/#sec-abstract-relational-comparison',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/7.0/#sec-addrestrictedfunctionproperties',
+	AdvanceStringIndex: 'https://262.ecma-international.org/7.0/#sec-advancestringindex',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/7.0/#sec-allocatearraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/7.0/#sec-allocatetypedarray',
+	AllocateTypedArrayBuffer: 'https://262.ecma-international.org/7.0/#sec-allocatetypedarraybuffer',
+	ArrayCreate: 'https://262.ecma-international.org/7.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/7.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/7.0/#sec-arrayspeciescreate',
+	BlockDeclarationInstantiation: 'https://262.ecma-international.org/7.0/#sec-blockdeclarationinstantiation',
+	BoundFunctionCreate: 'https://262.ecma-international.org/7.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/7.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/7.0/#sec-canonicalnumericindexstring',
+	CharacterRange: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterRangeOrUnion: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/7.0/#sec-clonearraybuffer',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/7.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/7.0/#sec-completion-record-specification-type',
+	Construct: 'https://262.ecma-international.org/7.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/7.0/#sec-copydatablockbytes',
+	CreateArrayFromList: 'https://262.ecma-international.org/7.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/7.0/#sec-createarrayiterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/7.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/7.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/7.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/7.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/7.0/#sec-createdynamicfunction',
+	CreateHTML: 'https://262.ecma-international.org/7.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/7.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/7.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/7.0/#sec-createlistfromarraylike',
+	CreateListIterator: 'https://262.ecma-international.org/7.0/#sec-createlistiterator',
+	CreateMapIterator: 'https://262.ecma-international.org/7.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/7.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/7.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/7.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/7.0/#sec-createrealm',
+	CreateResolvingFunctions: 'https://262.ecma-international.org/7.0/#sec-createresolvingfunctions',
+	CreateSetIterator: 'https://262.ecma-international.org/7.0/#sec-createsetiterator',
+	CreateStringIterator: 'https://262.ecma-international.org/7.0/#sec-createstringiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/7.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/7.0/#sec-date-number',
+	Day: 'https://262.ecma-international.org/7.0/#sec-day-number-and-time-within-day',
+	DayFromYear: 'https://262.ecma-international.org/7.0/#sec-year-number',
+	DaylightSavingTA: 'https://262.ecma-international.org/7.0/#sec-daylight-saving-time-adjustment',
+	DaysInYear: 'https://262.ecma-international.org/7.0/#sec-year-number',
+	DayWithinYear: 'https://262.ecma-international.org/7.0/#sec-month-number',
+	Decode: 'https://262.ecma-international.org/7.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/7.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/7.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/7.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/7.0/#sec-encode',
+	EnqueueJob: 'https://262.ecma-international.org/7.0/#sec-enqueuejob',
+	EnumerableOwnNames: 'https://262.ecma-international.org/7.0/#sec-enumerableownnames',
+	EnumerateObjectProperties: 'https://262.ecma-international.org/7.0/#sec-enumerate-object-properties',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/7.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/7.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/7.0/#sec-evaluatecall',
+	EvaluateDirectCall: 'https://262.ecma-international.org/7.0/#sec-evaluatedirectcall',
+	EvaluateNew: 'https://262.ecma-international.org/7.0/#sec-evaluatenew',
+	floor: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions',
+	ForBodyEvaluation: 'https://262.ecma-international.org/7.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/7.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/7.0/#sec-fulfillpromise',
+	FunctionAllocate: 'https://262.ecma-international.org/7.0/#sec-functionallocate',
+	FunctionCreate: 'https://262.ecma-international.org/7.0/#sec-functioncreate',
+	FunctionDeclarationInstantiation: 'https://262.ecma-international.org/7.0/#sec-functiondeclarationinstantiation',
+	FunctionInitialize: 'https://262.ecma-international.org/7.0/#sec-functioninitialize',
+	GeneratorFunctionCreate: 'https://262.ecma-international.org/7.0/#sec-generatorfunctioncreate',
+	GeneratorResume: 'https://262.ecma-international.org/7.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/7.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/7.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/7.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/7.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/7.0/#sec-get-o-p',
+	GetActiveScriptOrModule: 'https://262.ecma-international.org/7.0/#sec-getactivescriptormodule',
+	GetFunctionRealm: 'https://262.ecma-international.org/7.0/#sec-getfunctionrealm',
+	GetGlobalObject: 'https://262.ecma-international.org/7.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/7.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/7.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/7.0/#sec-getmethod',
+	GetModuleNamespace: 'https://262.ecma-international.org/7.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/7.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/7.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/7.0/#sec-getprototypefromconstructor',
+	GetSubstitution: 'https://262.ecma-international.org/7.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/7.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/7.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/7.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/7.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/7.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/7.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/7.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/7.0/#sec-getviewvalue',
+	GlobalDeclarationInstantiation: 'https://262.ecma-international.org/7.0/#sec-globaldeclarationinstantiation',
+	HasOwnProperty: 'https://262.ecma-international.org/7.0/#sec-hasownproperty',
+	HasProperty: 'https://262.ecma-international.org/7.0/#sec-hasproperty',
+	HostPromiseRejectionTracker: 'https://262.ecma-international.org/7.0/#sec-host-promise-rejection-tracker',
+	HostReportErrors: 'https://262.ecma-international.org/7.0/#sec-host-report-errors',
+	HostResolveImportedModule: 'https://262.ecma-international.org/7.0/#sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds',
+	IfAbruptRejectPromise: 'https://262.ecma-international.org/7.0/#sec-ifabruptrejectpromise',
+	ImportedLocalNames: 'https://262.ecma-international.org/7.0/#sec-importedlocalnames',
+	InitializeBoundName: 'https://262.ecma-international.org/7.0/#sec-initializeboundname',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/7.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/7.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/7.0/#sec-year-number',
+	InstanceofOperator: 'https://262.ecma-international.org/7.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/7.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/7.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/7.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/7.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/7.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/7.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/7.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/7.0/#sec-isarray',
+	IsCallable: 'https://262.ecma-international.org/7.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/7.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/7.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/7.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/7.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/7.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/7.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/7.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/7.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/7.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/7.0/#sec-islabelledfunction',
+	IsPromise: 'https://262.ecma-international.org/7.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/7.0/#sec-ispropertykey',
+	IsRegExp: 'https://262.ecma-international.org/7.0/#sec-isregexp',
+	IsWordChar: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IterableToArrayLike: 'https://262.ecma-international.org/7.0/#sec-iterabletoarraylike',
+	IteratorClose: 'https://262.ecma-international.org/7.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/7.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/7.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/7.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/7.0/#sec-iteratorvalue',
+	LocalTime: 'https://262.ecma-international.org/7.0/#sec-localtime',
+	LoopContinues: 'https://262.ecma-international.org/7.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/7.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/7.0/#sec-makeargsetter',
+	MakeClassConstructor: 'https://262.ecma-international.org/7.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/7.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/7.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/7.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/7.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/7.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/7.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions',
+	min: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions',
+	MinFromTime: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/7.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions',
+	MonthFromTime: 'https://262.ecma-international.org/7.0/#sec-month-number',
+	msFromTime: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/7.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/7.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/7.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/7.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/7.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/7.0/#sec-newpromisecapability',
+	NextJob: 'https://262.ecma-international.org/7.0/#sec-nextjob-result',
+	NormalCompletion: 'https://262.ecma-international.org/7.0/#sec-normalcompletion',
+	ObjectCreate: 'https://262.ecma-international.org/7.0/#sec-objectcreate',
+	ObjectDefineProperties: 'https://262.ecma-international.org/7.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/7.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/7.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/7.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/7.0/#sec-ordinarydefineownproperty',
+	OrdinaryDelete: 'https://262.ecma-international.org/7.0/#sec-ordinarydelete',
+	OrdinaryGet: 'https://262.ecma-international.org/7.0/#sec-ordinaryget',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/7.0/#sec-ordinarygetownproperty',
+	OrdinaryGetPrototypeOf: 'https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/7.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/7.0/#sec-ordinaryhasproperty',
+	OrdinaryIsExtensible: 'https://262.ecma-international.org/7.0/#sec-ordinaryisextensible',
+	OrdinaryOwnPropertyKeys: 'https://262.ecma-international.org/7.0/#sec-ordinaryownpropertykeys',
+	OrdinaryPreventExtensions: 'https://262.ecma-international.org/7.0/#sec-ordinarypreventextensions',
+	OrdinarySet: 'https://262.ecma-international.org/7.0/#sec-ordinaryset',
+	OrdinarySetPrototypeOf: 'https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof',
+	ParseModule: 'https://262.ecma-international.org/7.0/#sec-parsemodule',
+	ParseScript: 'https://262.ecma-international.org/7.0/#sec-parse-script',
+	PerformEval: 'https://262.ecma-international.org/7.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/7.0/#sec-performpromiseall',
+	PerformPromiseRace: 'https://262.ecma-international.org/7.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/7.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/7.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/7.0/#sec-preparefortailcall',
+	PromiseReactionJob: 'https://262.ecma-international.org/7.0/#sec-promisereactionjob',
+	PromiseResolveThenableJob: 'https://262.ecma-international.org/7.0/#sec-promiseresolvethenablejob',
+	ProxyCreate: 'https://262.ecma-international.org/7.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/7.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/7.0/#sec-quotejsonstring',
+	RegExpAlloc: 'https://262.ecma-international.org/7.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/7.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/7.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/7.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/7.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/7.0/#sec-rejectpromise',
+	RepeatMatcher: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireObjectCoercible: 'https://262.ecma-international.org/7.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/7.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/7.0/#sec-resolvethisbinding',
+	ReturnIfAbrupt: 'https://262.ecma-international.org/7.0/#sec-returnifabrupt',
+	SameValue: 'https://262.ecma-international.org/7.0/#sec-samevalue',
+	SameValueNonNumber: 'https://262.ecma-international.org/7.0/#sec-samevaluenonnumber',
+	SameValueZero: 'https://262.ecma-international.org/7.0/#sec-samevaluezero',
+	ScriptEvaluation: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-scriptevaluation',
+	ScriptEvaluationJob: 'https://262.ecma-international.org/7.0/#sec-scriptevaluationjob',
+	SecFromTime: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds',
+	SerializeJSONArray: 'https://262.ecma-international.org/7.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/7.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/7.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/7.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/7.0/#sec-setdefaultglobalbindings',
+	SetFunctionName: 'https://262.ecma-international.org/7.0/#sec-setfunctionname',
+	SetIntegrityLevel: 'https://262.ecma-international.org/7.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/7.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/7.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/7.0/#sec-setviewvalue',
+	SortCompare: 'https://262.ecma-international.org/7.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/7.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/7.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/7.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/7.0/#sec-stringcreate',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/7.0/#sec-symboldescriptivestring',
+	TestIntegrityLevel: 'https://262.ecma-international.org/7.0/#sec-testintegritylevel',
+	thisBooleanValue: 'https://262.ecma-international.org/7.0/#sec-thisbooleanvalue',
+	thisNumberValue: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-number-prototype-object',
+	thisStringValue: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-string-prototype-object',
+	thisTimeValue: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-date-prototype-object',
+	TimeClip: 'https://262.ecma-international.org/7.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/7.0/#sec-year-number',
+	TimeWithinDay: 'https://262.ecma-international.org/7.0/#sec-day-number-and-time-within-day',
+	ToBoolean: 'https://262.ecma-international.org/7.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/7.0/#sec-todatestring',
+	ToInt16: 'https://262.ecma-international.org/7.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/7.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/7.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/7.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/7.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/7.0/#sec-tonumber',
+	ToObject: 'https://262.ecma-international.org/7.0/#sec-toobject',
+	TopLevelModuleEvaluationJob: 'https://262.ecma-international.org/7.0/#sec-toplevelmoduleevaluationjob',
+	ToPrimitive: 'https://262.ecma-international.org/7.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/7.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/7.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/7.0/#sec-tostring',
+	'ToString Applied to the Number Type': 'https://262.ecma-international.org/7.0/#sec-tostring-applied-to-the-number-type',
+	ToUint16: 'https://262.ecma-international.org/7.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/7.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/7.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/7.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/7.0/#sec-triggerpromisereactions',
+	Type: 'https://262.ecma-international.org/7.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayCreate: 'https://262.ecma-international.org/7.0/#typedarray-create',
+	TypedArraySpeciesCreate: 'https://262.ecma-international.org/7.0/#typedarray-species-create',
+	UpdateEmpty: 'https://262.ecma-international.org/7.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/7.0/#sec-utc-t',
+	UTF16Decode: 'https://262.ecma-international.org/7.0/#sec-utf16decode',
+	UTF16Encoding: 'https://262.ecma-international.org/7.0/#sec-utf16encoding',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/7.0/#sec-validateandapplypropertydescriptor',
+	ValidateTypedArray: 'https://262.ecma-international.org/7.0/#sec-validatetypedarray',
+	WeekDay: 'https://262.ecma-international.org/7.0/#sec-week-day',
+	YearFromTime: 'https://262.ecma-international.org/7.0/#sec-year-number'
+};
diff --git a/node_modules/es-abstract/operations/2017.js b/node_modules/es-abstract/operations/2017.js
new file mode 100644
index 0000000..b3a313f
--- /dev/null
+++ b/node_modules/es-abstract/operations/2017.js
@@ -0,0 +1,325 @@
+'use strict';
+
+module.exports = {
+	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op
+
+	abs: 'https://262.ecma-international.org/8.0/#eqn-abs',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/8.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/8.0/#sec-abstract-relational-comparison',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/8.0/#sec-addrestrictedfunctionproperties',
+	AddWaiter: 'https://262.ecma-international.org/8.0/#sec-addwaiter',
+	AdvanceStringIndex: 'https://262.ecma-international.org/8.0/#sec-advancestringindex',
+	'agent-order': 'https://262.ecma-international.org/8.0/#sec-agent-order',
+	AgentCanSuspend: 'https://262.ecma-international.org/8.0/#sec-agentcansuspend',
+	AgentSignifier: 'https://262.ecma-international.org/8.0/#sec-agentsignifier',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-allocatearraybuffer',
+	AllocateSharedArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-allocatesharedarraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/8.0/#sec-allocatetypedarray',
+	AllocateTypedArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-allocatetypedarraybuffer',
+	ArrayCreate: 'https://262.ecma-international.org/8.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/8.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/8.0/#sec-arrayspeciescreate',
+	AsyncFunctionAwait: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-await',
+	AsyncFunctionCreate: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-create',
+	AsyncFunctionStart: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-start',
+	AtomicLoad: 'https://262.ecma-international.org/8.0/#sec-atomicload',
+	AtomicReadModifyWrite: 'https://262.ecma-international.org/8.0/#sec-atomicreadmodifywrite',
+	BlockDeclarationInstantiation: 'https://262.ecma-international.org/8.0/#sec-blockdeclarationinstantiation',
+	BoundFunctionCreate: 'https://262.ecma-international.org/8.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/8.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/8.0/#sec-canonicalnumericindexstring',
+	CharacterRange: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterRangeOrUnion: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-clonearraybuffer',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/8.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/8.0/#sec-completion-record-specification-type',
+	ComposeWriteEventBytes: 'https://262.ecma-international.org/8.0/#sec-composewriteeventbytes',
+	Construct: 'https://262.ecma-international.org/8.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/8.0/#sec-copydatablockbytes',
+	CreateArrayFromList: 'https://262.ecma-international.org/8.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/8.0/#sec-createarrayiterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/8.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/8.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/8.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/8.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/8.0/#sec-createdynamicfunction',
+	CreateHTML: 'https://262.ecma-international.org/8.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/8.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/8.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/8.0/#sec-createlistfromarraylike',
+	CreateListIterator: 'https://262.ecma-international.org/8.0/#sec-createlistiterator',
+	CreateMapIterator: 'https://262.ecma-international.org/8.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/8.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/8.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/8.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/8.0/#sec-createrealm',
+	CreateResolvingFunctions: 'https://262.ecma-international.org/8.0/#sec-createresolvingfunctions',
+	CreateSetIterator: 'https://262.ecma-international.org/8.0/#sec-createsetiterator',
+	CreateSharedByteDataBlock: 'https://262.ecma-international.org/8.0/#sec-createsharedbytedatablock',
+	CreateStringIterator: 'https://262.ecma-international.org/8.0/#sec-createstringiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/8.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/8.0/#sec-date-number',
+	Day: 'https://262.ecma-international.org/8.0/#eqn-Day',
+	DayFromYear: 'https://262.ecma-international.org/8.0/#eqn-DaysFromYear',
+	DaylightSavingTA: 'https://262.ecma-international.org/8.0/#sec-daylight-saving-time-adjustment',
+	DaysInYear: 'https://262.ecma-international.org/8.0/#eqn-DaysInYear',
+	DayWithinYear: 'https://262.ecma-international.org/8.0/#eqn-DayWithinYear',
+	Decode: 'https://262.ecma-international.org/8.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/8.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/8.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/8.0/#sec-encode',
+	EnqueueJob: 'https://262.ecma-international.org/8.0/#sec-enqueuejob',
+	EnterCriticalSection: 'https://262.ecma-international.org/8.0/#sec-entercriticalsection',
+	EnumerableOwnProperties: 'https://262.ecma-international.org/8.0/#sec-enumerableownproperties',
+	EnumerateObjectProperties: 'https://262.ecma-international.org/8.0/#sec-enumerate-object-properties',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/8.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/8.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/8.0/#sec-evaluatecall',
+	EvaluateDirectCall: 'https://262.ecma-international.org/8.0/#sec-evaluatedirectcall',
+	EvaluateNew: 'https://262.ecma-international.org/8.0/#sec-evaluatenew',
+	EventSet: 'https://262.ecma-international.org/8.0/#sec-event-set',
+	floor: 'https://262.ecma-international.org/8.0/#eqn-floor',
+	ForBodyEvaluation: 'https://262.ecma-international.org/8.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/8.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/8.0/#sec-fulfillpromise',
+	FunctionAllocate: 'https://262.ecma-international.org/8.0/#sec-functionallocate',
+	FunctionCreate: 'https://262.ecma-international.org/8.0/#sec-functioncreate',
+	FunctionDeclarationInstantiation: 'https://262.ecma-international.org/8.0/#sec-functiondeclarationinstantiation',
+	FunctionInitialize: 'https://262.ecma-international.org/8.0/#sec-functioninitialize',
+	GeneratorFunctionCreate: 'https://262.ecma-international.org/8.0/#sec-generatorfunctioncreate',
+	GeneratorResume: 'https://262.ecma-international.org/8.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/8.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/8.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/8.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/8.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/8.0/#sec-get-o-p',
+	GetActiveScriptOrModule: 'https://262.ecma-international.org/8.0/#sec-getactivescriptormodule',
+	GetBase: 'https://262.ecma-international.org/8.0/#ao-getbase',
+	GetFunctionRealm: 'https://262.ecma-international.org/8.0/#sec-getfunctionrealm',
+	GetGlobalObject: 'https://262.ecma-international.org/8.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/8.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/8.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/8.0/#sec-getmethod',
+	GetModifySetValueInBuffer: 'https://262.ecma-international.org/8.0/#sec-getmodifysetvalueinbuffer',
+	GetModuleNamespace: 'https://262.ecma-international.org/8.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/8.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/8.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/8.0/#sec-getprototypefromconstructor',
+	GetReferencedName: 'https://262.ecma-international.org/8.0/#ao-getreferencedname',
+	GetSubstitution: 'https://262.ecma-international.org/8.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/8.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/8.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/8.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/8.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/8.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/8.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/8.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/8.0/#sec-getviewvalue',
+	GetWaiterList: 'https://262.ecma-international.org/8.0/#sec-getwaiterlist',
+	GlobalDeclarationInstantiation: 'https://262.ecma-international.org/8.0/#sec-globaldeclarationinstantiation',
+	'happens-before': 'https://262.ecma-international.org/8.0/#sec-happens-before',
+	HasOwnProperty: 'https://262.ecma-international.org/8.0/#sec-hasownproperty',
+	HasPrimitiveBase: 'https://262.ecma-international.org/8.0/#ao-hasprimitivebase',
+	HasProperty: 'https://262.ecma-international.org/8.0/#sec-hasproperty',
+	'host-synchronizes-with': 'https://262.ecma-international.org/8.0/#sec-host-synchronizes-with',
+	HostEnsureCanCompileStrings: 'https://262.ecma-international.org/8.0/#sec-hostensurecancompilestrings',
+	HostEventSet: 'https://262.ecma-international.org/8.0/#sec-hosteventset',
+	HostPromiseRejectionTracker: 'https://262.ecma-international.org/8.0/#sec-host-promise-rejection-tracker',
+	HostReportErrors: 'https://262.ecma-international.org/8.0/#sec-host-report-errors',
+	HostResolveImportedModule: 'https://262.ecma-international.org/8.0/#sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/8.0/#eqn-HourFromTime',
+	IfAbruptRejectPromise: 'https://262.ecma-international.org/8.0/#sec-ifabruptrejectpromise',
+	ImportedLocalNames: 'https://262.ecma-international.org/8.0/#sec-importedlocalnames',
+	InitializeBoundName: 'https://262.ecma-international.org/8.0/#sec-initializeboundname',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/8.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/8.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/8.0/#eqn-InLeapYear',
+	InstanceofOperator: 'https://262.ecma-international.org/8.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/8.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/8.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/8.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/8.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/8.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/8.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/8.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/8.0/#sec-isarray',
+	IsCallable: 'https://262.ecma-international.org/8.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/8.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/8.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/8.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/8.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/8.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/8.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/8.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/8.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/8.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/8.0/#sec-islabelledfunction',
+	IsPromise: 'https://262.ecma-international.org/8.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/8.0/#sec-ispropertykey',
+	IsPropertyReference: 'https://262.ecma-international.org/8.0/#ao-ispropertyreference',
+	IsRegExp: 'https://262.ecma-international.org/8.0/#sec-isregexp',
+	IsSharedArrayBuffer: 'https://262.ecma-international.org/8.0/#sec-issharedarraybuffer',
+	IsStrictReference: 'https://262.ecma-international.org/8.0/#ao-isstrictreference',
+	IsSuperReference: 'https://262.ecma-international.org/8.0/#ao-issuperreference',
+	IsUnresolvableReference: 'https://262.ecma-international.org/8.0/#ao-isunresolvablereference',
+	IsWordChar: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IterableToList: 'https://262.ecma-international.org/8.0/#sec-iterabletolist',
+	IteratorClose: 'https://262.ecma-international.org/8.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/8.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/8.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/8.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/8.0/#sec-iteratorvalue',
+	LeaveCriticalSection: 'https://262.ecma-international.org/8.0/#sec-leavecriticalsection',
+	LocalTime: 'https://262.ecma-international.org/8.0/#sec-localtime',
+	LoopContinues: 'https://262.ecma-international.org/8.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/8.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/8.0/#sec-makeargsetter',
+	MakeClassConstructor: 'https://262.ecma-international.org/8.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/8.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/8.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/8.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/8.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/8.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/8.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/8.0/#eqn-max',
+	'memory-order': 'https://262.ecma-international.org/8.0/#sec-memory-order',
+	min: 'https://262.ecma-international.org/8.0/#eqn-min',
+	MinFromTime: 'https://262.ecma-international.org/8.0/#eqn-MinFromTime',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/8.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/8.0/#eqn-modulo',
+	MonthFromTime: 'https://262.ecma-international.org/8.0/#eqn-MonthFromTime',
+	msFromTime: 'https://262.ecma-international.org/8.0/#eqn-msFromTime',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/8.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/8.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/8.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/8.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/8.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/8.0/#sec-newpromisecapability',
+	NormalCompletion: 'https://262.ecma-international.org/8.0/#sec-normalcompletion',
+	NumberToRawBytes: 'https://262.ecma-international.org/8.0/#sec-numbertorawbytes',
+	ObjectCreate: 'https://262.ecma-international.org/8.0/#sec-objectcreate',
+	ObjectDefineProperties: 'https://262.ecma-international.org/8.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/8.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/8.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/8.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/8.0/#sec-ordinarydefineownproperty',
+	OrdinaryDelete: 'https://262.ecma-international.org/8.0/#sec-ordinarydelete',
+	OrdinaryGet: 'https://262.ecma-international.org/8.0/#sec-ordinaryget',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/8.0/#sec-ordinarygetownproperty',
+	OrdinaryGetPrototypeOf: 'https://262.ecma-international.org/8.0/#sec-ordinarygetprototypeof',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/8.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/8.0/#sec-ordinaryhasproperty',
+	OrdinaryIsExtensible: 'https://262.ecma-international.org/8.0/#sec-ordinaryisextensible',
+	OrdinaryOwnPropertyKeys: 'https://262.ecma-international.org/8.0/#sec-ordinaryownpropertykeys',
+	OrdinaryPreventExtensions: 'https://262.ecma-international.org/8.0/#sec-ordinarypreventextensions',
+	OrdinarySet: 'https://262.ecma-international.org/8.0/#sec-ordinaryset',
+	OrdinarySetPrototypeOf: 'https://262.ecma-international.org/8.0/#sec-ordinarysetprototypeof',
+	OrdinaryToPrimitive: 'https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive',
+	ParseModule: 'https://262.ecma-international.org/8.0/#sec-parsemodule',
+	ParseScript: 'https://262.ecma-international.org/8.0/#sec-parse-script',
+	PerformEval: 'https://262.ecma-international.org/8.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/8.0/#sec-performpromiseall',
+	PerformPromiseRace: 'https://262.ecma-international.org/8.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/8.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/8.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/8.0/#sec-preparefortailcall',
+	PromiseReactionJob: 'https://262.ecma-international.org/8.0/#sec-promisereactionjob',
+	PromiseResolveThenableJob: 'https://262.ecma-international.org/8.0/#sec-promiseresolvethenablejob',
+	ProxyCreate: 'https://262.ecma-international.org/8.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/8.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/8.0/#sec-quotejsonstring',
+	RawBytesToNumber: 'https://262.ecma-international.org/8.0/#sec-rawbytestonumber',
+	'reads-bytes-from': 'https://262.ecma-international.org/8.0/#sec-reads-bytes-from',
+	'reads-from': 'https://262.ecma-international.org/8.0/#sec-reads-from',
+	RegExpAlloc: 'https://262.ecma-international.org/8.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/8.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/8.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/8.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/8.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/8.0/#sec-rejectpromise',
+	RemoveWaiter: 'https://262.ecma-international.org/8.0/#sec-removewaiter',
+	RemoveWaiters: 'https://262.ecma-international.org/8.0/#sec-removewaiters',
+	RepeatMatcher: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireObjectCoercible: 'https://262.ecma-international.org/8.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/8.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/8.0/#sec-resolvethisbinding',
+	ReturnIfAbrupt: 'https://262.ecma-international.org/8.0/#sec-returnifabrupt',
+	RunJobs: 'https://262.ecma-international.org/8.0/#sec-runjobs',
+	SameValue: 'https://262.ecma-international.org/8.0/#sec-samevalue',
+	SameValueNonNumber: 'https://262.ecma-international.org/8.0/#sec-samevaluenonnumber',
+	SameValueZero: 'https://262.ecma-international.org/8.0/#sec-samevaluezero',
+	ScriptEvaluation: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-scriptevaluation',
+	ScriptEvaluationJob: 'https://262.ecma-international.org/8.0/#sec-scriptevaluationjob',
+	SecFromTime: 'https://262.ecma-international.org/8.0/#eqn-SecFromTime',
+	SerializeJSONArray: 'https://262.ecma-international.org/8.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/8.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/8.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/8.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/8.0/#sec-setdefaultglobalbindings',
+	SetFunctionName: 'https://262.ecma-international.org/8.0/#sec-setfunctionname',
+	SetImmutablePrototype: 'https://262.ecma-international.org/8.0/#sec-set-immutable-prototype',
+	SetIntegrityLevel: 'https://262.ecma-international.org/8.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/8.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/8.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/8.0/#sec-setviewvalue',
+	SharedDataBlockEventSet: 'https://262.ecma-international.org/8.0/#sec-sharedatablockeventset',
+	SortCompare: 'https://262.ecma-international.org/8.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/8.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/8.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/8.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/8.0/#sec-stringcreate',
+	StringGetOwnProperty: 'https://262.ecma-international.org/8.0/#sec-stringgetownproperty',
+	Suspend: 'https://262.ecma-international.org/8.0/#sec-suspend',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/8.0/#sec-symboldescriptivestring',
+	'synchronizes-with': 'https://262.ecma-international.org/8.0/#sec-synchronizes-with',
+	TestIntegrityLevel: 'https://262.ecma-international.org/8.0/#sec-testintegritylevel',
+	thisBooleanValue: 'https://262.ecma-international.org/8.0/#sec-thisbooleanvalue',
+	thisNumberValue: 'https://262.ecma-international.org/8.0/#sec-thisnumbervalue',
+	thisStringValue: 'https://262.ecma-international.org/8.0/#sec-thisstringvalue',
+	thisTimeValue: 'https://262.ecma-international.org/8.0/#sec-thistimevalue',
+	TimeClip: 'https://262.ecma-international.org/8.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/8.0/#eqn-TimeFromYear',
+	TimeWithinDay: 'https://262.ecma-international.org/8.0/#eqn-TimeWithinDay',
+	ToBoolean: 'https://262.ecma-international.org/8.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/8.0/#sec-todatestring',
+	ToIndex: 'https://262.ecma-international.org/8.0/#sec-toindex',
+	ToInt16: 'https://262.ecma-international.org/8.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/8.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/8.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/8.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/8.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/8.0/#sec-tonumber',
+	ToObject: 'https://262.ecma-international.org/8.0/#sec-toobject',
+	TopLevelModuleEvaluationJob: 'https://262.ecma-international.org/8.0/#sec-toplevelmoduleevaluationjob',
+	ToPrimitive: 'https://262.ecma-international.org/8.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/8.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/8.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/8.0/#sec-tostring',
+	'ToString Applied to the Number Type': 'https://262.ecma-international.org/8.0/#sec-tostring-applied-to-the-number-type',
+	ToUint16: 'https://262.ecma-international.org/8.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/8.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/8.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/8.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/8.0/#sec-triggerpromisereactions',
+	Type: 'https://262.ecma-international.org/8.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayCreate: 'https://262.ecma-international.org/8.0/#typedarray-create',
+	TypedArraySpeciesCreate: 'https://262.ecma-international.org/8.0/#typedarray-species-create',
+	UpdateEmpty: 'https://262.ecma-international.org/8.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/8.0/#sec-utc-t',
+	UTF16Decode: 'https://262.ecma-international.org/8.0/#sec-utf16decode',
+	UTF16Encoding: 'https://262.ecma-international.org/8.0/#sec-utf16encoding',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/8.0/#sec-validateandapplypropertydescriptor',
+	ValidateAtomicAccess: 'https://262.ecma-international.org/8.0/#sec-validateatomicaccess',
+	ValidateSharedIntegerTypedArray: 'https://262.ecma-international.org/8.0/#sec-validatesharedintegertypedarray',
+	ValidateTypedArray: 'https://262.ecma-international.org/8.0/#sec-validatetypedarray',
+	ValueOfReadEvent: 'https://262.ecma-international.org/8.0/#sec-valueofreadevent',
+	WakeWaiter: 'https://262.ecma-international.org/8.0/#sec-wakewaiter',
+	WeekDay: 'https://262.ecma-international.org/8.0/#sec-week-day',
+	WordCharacters: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
+	YearFromTime: 'https://262.ecma-international.org/8.0/#eqn-YearFromTime'
+};
diff --git a/node_modules/es-abstract/operations/2018.js b/node_modules/es-abstract/operations/2018.js
new file mode 100644
index 0000000..10d10f2
--- /dev/null
+++ b/node_modules/es-abstract/operations/2018.js
@@ -0,0 +1,350 @@
+'use strict';
+
+module.exports = {
+	abs: 'https://262.ecma-international.org/9.0/#eqn-abs',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/9.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/9.0/#sec-addrestrictedfunctionproperties',
+	AddWaiter: 'https://262.ecma-international.org/9.0/#sec-addwaiter',
+	AdvanceStringIndex: 'https://262.ecma-international.org/9.0/#sec-advancestringindex',
+	'agent-order': 'https://262.ecma-international.org/9.0/#sec-agent-order',
+	AgentCanSuspend: 'https://262.ecma-international.org/9.0/#sec-agentcansuspend',
+	AgentSignifier: 'https://262.ecma-international.org/9.0/#sec-agentsignifier',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-allocatearraybuffer',
+	AllocateSharedArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-allocatesharedarraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/9.0/#sec-allocatetypedarray',
+	AllocateTypedArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-allocatetypedarraybuffer',
+	ArrayCreate: 'https://262.ecma-international.org/9.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/9.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/9.0/#sec-arrayspeciescreate',
+	AsyncFunctionCreate: 'https://262.ecma-international.org/9.0/#sec-async-functions-abstract-operations-async-function-create',
+	AsyncFunctionStart: 'https://262.ecma-international.org/9.0/#sec-async-functions-abstract-operations-async-function-start',
+	AsyncGeneratorEnqueue: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorenqueue',
+	AsyncGeneratorFunctionCreate: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorfunctioncreate',
+	AsyncGeneratorReject: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorreject',
+	AsyncGeneratorResolve: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorresolve',
+	AsyncGeneratorResumeNext: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorresumenext',
+	AsyncGeneratorStart: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorstart',
+	AsyncGeneratorYield: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratoryield',
+	AsyncIteratorClose: 'https://262.ecma-international.org/9.0/#sec-asynciteratorclose',
+	AtomicLoad: 'https://262.ecma-international.org/9.0/#sec-atomicload',
+	AtomicReadModifyWrite: 'https://262.ecma-international.org/9.0/#sec-atomicreadmodifywrite',
+	Await: 'https://262.ecma-international.org/9.0/#await',
+	BackreferenceMatcher: 'https://262.ecma-international.org/9.0/#sec-backreference-matcher',
+	BlockDeclarationInstantiation: 'https://262.ecma-international.org/9.0/#sec-blockdeclarationinstantiation',
+	BoundFunctionCreate: 'https://262.ecma-international.org/9.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/9.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/9.0/#sec-canonicalnumericindexstring',
+	CaseClauseIsSelected: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-caseclauseisselected',
+	CharacterRange: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterRangeOrUnion: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-clonearraybuffer',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/9.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/9.0/#sec-completion-record-specification-type',
+	ComposeWriteEventBytes: 'https://262.ecma-international.org/9.0/#sec-composewriteeventbytes',
+	Construct: 'https://262.ecma-international.org/9.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/9.0/#sec-copydatablockbytes',
+	CopyDataProperties: 'https://262.ecma-international.org/9.0/#sec-copydataproperties',
+	CreateArrayFromList: 'https://262.ecma-international.org/9.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/9.0/#sec-createarrayiterator',
+	CreateAsyncFromSyncIterator: 'https://262.ecma-international.org/9.0/#sec-createasyncfromsynciterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/9.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/9.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/9.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/9.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/9.0/#sec-createdynamicfunction',
+	CreateHTML: 'https://262.ecma-international.org/9.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/9.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/9.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/9.0/#sec-createlistfromarraylike',
+	CreateListIteratorRecord: 'https://262.ecma-international.org/9.0/#sec-createlistiteratorRecord',
+	CreateMapIterator: 'https://262.ecma-international.org/9.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/9.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/9.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/9.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/9.0/#sec-createrealm',
+	CreateResolvingFunctions: 'https://262.ecma-international.org/9.0/#sec-createresolvingfunctions',
+	CreateSetIterator: 'https://262.ecma-international.org/9.0/#sec-createsetiterator',
+	CreateSharedByteDataBlock: 'https://262.ecma-international.org/9.0/#sec-createsharedbytedatablock',
+	CreateStringIterator: 'https://262.ecma-international.org/9.0/#sec-createstringiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/9.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/9.0/#sec-date-number',
+	DateString: 'https://262.ecma-international.org/9.0/#sec-datestring',
+	Day: 'https://262.ecma-international.org/9.0/#eqn-Day',
+	DayFromYear: 'https://262.ecma-international.org/9.0/#eqn-DaysFromYear',
+	DaysInYear: 'https://262.ecma-international.org/9.0/#eqn-DaysInYear',
+	DayWithinYear: 'https://262.ecma-international.org/9.0/#eqn-DayWithinYear',
+	Decode: 'https://262.ecma-international.org/9.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/9.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/9.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/9.0/#sec-encode',
+	EnqueueJob: 'https://262.ecma-international.org/9.0/#sec-enqueuejob',
+	EnterCriticalSection: 'https://262.ecma-international.org/9.0/#sec-entercriticalsection',
+	EnumerableOwnPropertyNames: 'https://262.ecma-international.org/9.0/#sec-enumerableownpropertynames',
+	EnumerateObjectProperties: 'https://262.ecma-international.org/9.0/#sec-enumerate-object-properties',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/9.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/9.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/9.0/#sec-evaluatecall',
+	EvaluateNew: 'https://262.ecma-international.org/9.0/#sec-evaluatenew',
+	EventSet: 'https://262.ecma-international.org/9.0/#sec-event-set',
+	floor: 'https://262.ecma-international.org/9.0/#eqn-floor',
+	ForBodyEvaluation: 'https://262.ecma-international.org/9.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/9.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/9.0/#sec-fulfillpromise',
+	FunctionAllocate: 'https://262.ecma-international.org/9.0/#sec-functionallocate',
+	FunctionCreate: 'https://262.ecma-international.org/9.0/#sec-functioncreate',
+	FunctionDeclarationInstantiation: 'https://262.ecma-international.org/9.0/#sec-functiondeclarationinstantiation',
+	FunctionInitialize: 'https://262.ecma-international.org/9.0/#sec-functioninitialize',
+	GeneratorFunctionCreate: 'https://262.ecma-international.org/9.0/#sec-generatorfunctioncreate',
+	GeneratorResume: 'https://262.ecma-international.org/9.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/9.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/9.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/9.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/9.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/9.0/#sec-get-o-p',
+	GetActiveScriptOrModule: 'https://262.ecma-international.org/9.0/#sec-getactivescriptormodule',
+	GetBase: 'https://262.ecma-international.org/9.0/#sec-getbase',
+	GetFunctionRealm: 'https://262.ecma-international.org/9.0/#sec-getfunctionrealm',
+	GetGeneratorKind: 'https://262.ecma-international.org/9.0/#sec-getgeneratorkind',
+	GetGlobalObject: 'https://262.ecma-international.org/9.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/9.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/9.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/9.0/#sec-getmethod',
+	GetModifySetValueInBuffer: 'https://262.ecma-international.org/9.0/#sec-getmodifysetvalueinbuffer',
+	GetModuleNamespace: 'https://262.ecma-international.org/9.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/9.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/9.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/9.0/#sec-getprototypefromconstructor',
+	GetReferencedName: 'https://262.ecma-international.org/9.0/#sec-getreferencedname',
+	GetSubstitution: 'https://262.ecma-international.org/9.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/9.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/9.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/9.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/9.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/9.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/9.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/9.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/9.0/#sec-getviewvalue',
+	GetWaiterList: 'https://262.ecma-international.org/9.0/#sec-getwaiterlist',
+	GlobalDeclarationInstantiation: 'https://262.ecma-international.org/9.0/#sec-globaldeclarationinstantiation',
+	'happens-before': 'https://262.ecma-international.org/9.0/#sec-happens-before',
+	HasOwnProperty: 'https://262.ecma-international.org/9.0/#sec-hasownproperty',
+	HasPrimitiveBase: 'https://262.ecma-international.org/9.0/#sec-hasprimitivebase',
+	HasProperty: 'https://262.ecma-international.org/9.0/#sec-hasproperty',
+	'host-synchronizes-with': 'https://262.ecma-international.org/9.0/#sec-host-synchronizes-with',
+	HostEnsureCanCompileStrings: 'https://262.ecma-international.org/9.0/#sec-hostensurecancompilestrings',
+	HostEventSet: 'https://262.ecma-international.org/9.0/#sec-hosteventset',
+	HostPromiseRejectionTracker: 'https://262.ecma-international.org/9.0/#sec-host-promise-rejection-tracker',
+	HostReportErrors: 'https://262.ecma-international.org/9.0/#sec-host-report-errors',
+	HostResolveImportedModule: 'https://262.ecma-international.org/9.0/#sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/9.0/#eqn-HourFromTime',
+	IfAbruptRejectPromise: 'https://262.ecma-international.org/9.0/#sec-ifabruptrejectpromise',
+	ImportedLocalNames: 'https://262.ecma-international.org/9.0/#sec-importedlocalnames',
+	InitializeBoundName: 'https://262.ecma-international.org/9.0/#sec-initializeboundname',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/9.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/9.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/9.0/#eqn-InLeapYear',
+	InnerModuleEvaluation: 'https://262.ecma-international.org/9.0/#sec-innermoduleevaluation',
+	InnerModuleInstantiation: 'https://262.ecma-international.org/9.0/#sec-innermoduleinstantiation',
+	InstanceofOperator: 'https://262.ecma-international.org/9.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/9.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/9.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/9.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/9.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/9.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/9.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/9.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/9.0/#sec-isarray',
+	IsCallable: 'https://262.ecma-international.org/9.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/9.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/9.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/9.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/9.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/9.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/9.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/9.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/9.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/9.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/9.0/#sec-islabelledfunction',
+	IsPromise: 'https://262.ecma-international.org/9.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/9.0/#sec-ispropertykey',
+	IsPropertyReference: 'https://262.ecma-international.org/9.0/#sec-ispropertyreference',
+	IsRegExp: 'https://262.ecma-international.org/9.0/#sec-isregexp',
+	IsSharedArrayBuffer: 'https://262.ecma-international.org/9.0/#sec-issharedarraybuffer',
+	IsStrictReference: 'https://262.ecma-international.org/9.0/#sec-isstrictreference',
+	IsStringPrefix: 'https://262.ecma-international.org/9.0/#sec-isstringprefix',
+	IsSuperReference: 'https://262.ecma-international.org/9.0/#sec-issuperreference',
+	IsUnresolvableReference: 'https://262.ecma-international.org/9.0/#sec-isunresolvablereference',
+	IsWordChar: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IterableToList: 'https://262.ecma-international.org/9.0/#sec-iterabletolist',
+	IteratorClose: 'https://262.ecma-international.org/9.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/9.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/9.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/9.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/9.0/#sec-iteratorvalue',
+	LeaveCriticalSection: 'https://262.ecma-international.org/9.0/#sec-leavecriticalsection',
+	LocalTime: 'https://262.ecma-international.org/9.0/#sec-localtime',
+	LoopContinues: 'https://262.ecma-international.org/9.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/9.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/9.0/#sec-makeargsetter',
+	MakeClassConstructor: 'https://262.ecma-international.org/9.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/9.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/9.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/9.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/9.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/9.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/9.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/9.0/#eqn-max',
+	'memory-order': 'https://262.ecma-international.org/9.0/#sec-memory-order',
+	min: 'https://262.ecma-international.org/9.0/#eqn-min',
+	MinFromTime: 'https://262.ecma-international.org/9.0/#eqn-MinFromTime',
+	ModuleDeclarationEnvironmentSetup: 'https://262.ecma-international.org/9.0/#sec-moduledeclarationenvironmentsetup',
+	ModuleExecution: 'https://262.ecma-international.org/9.0/#sec-moduleexecution',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/9.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/9.0/#eqn-modulo',
+	MonthFromTime: 'https://262.ecma-international.org/9.0/#eqn-MonthFromTime',
+	msFromTime: 'https://262.ecma-international.org/9.0/#eqn-msFromTime',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/9.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/9.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/9.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/9.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/9.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/9.0/#sec-newpromisecapability',
+	NormalCompletion: 'https://262.ecma-international.org/9.0/#sec-normalcompletion',
+	NumberToRawBytes: 'https://262.ecma-international.org/9.0/#sec-numbertorawbytes',
+	NumberToString: 'https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type',
+	ObjectCreate: 'https://262.ecma-international.org/9.0/#sec-objectcreate',
+	ObjectDefineProperties: 'https://262.ecma-international.org/9.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/9.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/9.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/9.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/9.0/#sec-ordinarydefineownproperty',
+	OrdinaryDelete: 'https://262.ecma-international.org/9.0/#sec-ordinarydelete',
+	OrdinaryGet: 'https://262.ecma-international.org/9.0/#sec-ordinaryget',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/9.0/#sec-ordinarygetownproperty',
+	OrdinaryGetPrototypeOf: 'https://262.ecma-international.org/9.0/#sec-ordinarygetprototypeof',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/9.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/9.0/#sec-ordinaryhasproperty',
+	OrdinaryIsExtensible: 'https://262.ecma-international.org/9.0/#sec-ordinaryisextensible',
+	OrdinaryOwnPropertyKeys: 'https://262.ecma-international.org/9.0/#sec-ordinaryownpropertykeys',
+	OrdinaryPreventExtensions: 'https://262.ecma-international.org/9.0/#sec-ordinarypreventextensions',
+	OrdinarySet: 'https://262.ecma-international.org/9.0/#sec-ordinaryset',
+	OrdinarySetPrototypeOf: 'https://262.ecma-international.org/9.0/#sec-ordinarysetprototypeof',
+	OrdinarySetWithOwnDescriptor: 'https://262.ecma-international.org/9.0/#sec-ordinarysetwithowndescriptor',
+	OrdinaryToPrimitive: 'https://262.ecma-international.org/9.0/#sec-ordinarytoprimitive',
+	ParseModule: 'https://262.ecma-international.org/9.0/#sec-parsemodule',
+	ParseScript: 'https://262.ecma-international.org/9.0/#sec-parse-script',
+	PerformEval: 'https://262.ecma-international.org/9.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/9.0/#sec-performpromiseall',
+	PerformPromiseRace: 'https://262.ecma-international.org/9.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/9.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/9.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/9.0/#sec-preparefortailcall',
+	PromiseReactionJob: 'https://262.ecma-international.org/9.0/#sec-promisereactionjob',
+	PromiseResolve: 'https://262.ecma-international.org/9.0/#sec-promise-resolve',
+	PromiseResolveThenableJob: 'https://262.ecma-international.org/9.0/#sec-promiseresolvethenablejob',
+	ProxyCreate: 'https://262.ecma-international.org/9.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/9.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/9.0/#sec-quotejsonstring',
+	RawBytesToNumber: 'https://262.ecma-international.org/9.0/#sec-rawbytestonumber',
+	'reads-bytes-from': 'https://262.ecma-international.org/9.0/#sec-reads-bytes-from',
+	'reads-from': 'https://262.ecma-international.org/9.0/#sec-reads-from',
+	RegExpAlloc: 'https://262.ecma-international.org/9.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/9.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/9.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/9.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/9.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/9.0/#sec-rejectpromise',
+	RemoveWaiter: 'https://262.ecma-international.org/9.0/#sec-removewaiter',
+	RemoveWaiters: 'https://262.ecma-international.org/9.0/#sec-removewaiters',
+	RepeatMatcher: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireObjectCoercible: 'https://262.ecma-international.org/9.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/9.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/9.0/#sec-resolvethisbinding',
+	ReturnIfAbrupt: 'https://262.ecma-international.org/9.0/#sec-returnifabrupt',
+	RunJobs: 'https://262.ecma-international.org/9.0/#sec-runjobs',
+	SameValue: 'https://262.ecma-international.org/9.0/#sec-samevalue',
+	SameValueNonNumber: 'https://262.ecma-international.org/9.0/#sec-samevaluenonnumber',
+	SameValueZero: 'https://262.ecma-international.org/9.0/#sec-samevaluezero',
+	ScriptEvaluation: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-scriptevaluation',
+	ScriptEvaluationJob: 'https://262.ecma-international.org/9.0/#sec-scriptevaluationjob',
+	SecFromTime: 'https://262.ecma-international.org/9.0/#eqn-SecFromTime',
+	SerializeJSONArray: 'https://262.ecma-international.org/9.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/9.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/9.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/9.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/9.0/#sec-setdefaultglobalbindings',
+	SetFunctionLength: 'https://262.ecma-international.org/9.0/#sec-setfunctionlength',
+	SetFunctionName: 'https://262.ecma-international.org/9.0/#sec-setfunctionname',
+	SetImmutablePrototype: 'https://262.ecma-international.org/9.0/#sec-set-immutable-prototype',
+	SetIntegrityLevel: 'https://262.ecma-international.org/9.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/9.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/9.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/9.0/#sec-setviewvalue',
+	SharedDataBlockEventSet: 'https://262.ecma-international.org/9.0/#sec-sharedatablockeventset',
+	SortCompare: 'https://262.ecma-international.org/9.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/9.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/9.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/9.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/9.0/#sec-stringcreate',
+	StringGetOwnProperty: 'https://262.ecma-international.org/9.0/#sec-stringgetownproperty',
+	Suspend: 'https://262.ecma-international.org/9.0/#sec-suspend',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/9.0/#sec-symboldescriptivestring',
+	'synchronizes-with': 'https://262.ecma-international.org/9.0/#sec-synchronizes-with',
+	TestIntegrityLevel: 'https://262.ecma-international.org/9.0/#sec-testintegritylevel',
+	thisBooleanValue: 'https://262.ecma-international.org/9.0/#sec-thisbooleanvalue',
+	thisNumberValue: 'https://262.ecma-international.org/9.0/#sec-thisnumbervalue',
+	thisStringValue: 'https://262.ecma-international.org/9.0/#sec-thisstringvalue',
+	thisSymbolValue: 'https://262.ecma-international.org/9.0/#sec-thissymbolvalue',
+	thisTimeValue: 'https://262.ecma-international.org/9.0/#sec-thistimevalue',
+	ThrowCompletion: 'https://262.ecma-international.org/9.0/#sec-throwcompletion',
+	TimeClip: 'https://262.ecma-international.org/9.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/9.0/#eqn-TimeFromYear',
+	TimeString: 'https://262.ecma-international.org/9.0/#sec-timestring',
+	TimeWithinDay: 'https://262.ecma-international.org/9.0/#eqn-TimeWithinDay',
+	TimeZoneString: 'https://262.ecma-international.org/9.0/#sec-timezoneestring',
+	ToBoolean: 'https://262.ecma-international.org/9.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/9.0/#sec-todatestring',
+	ToIndex: 'https://262.ecma-international.org/9.0/#sec-toindex',
+	ToInt16: 'https://262.ecma-international.org/9.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/9.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/9.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/9.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/9.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/9.0/#sec-tonumber',
+	ToObject: 'https://262.ecma-international.org/9.0/#sec-toobject',
+	TopLevelModuleEvaluationJob: 'https://262.ecma-international.org/9.0/#sec-toplevelmoduleevaluationjob',
+	ToPrimitive: 'https://262.ecma-international.org/9.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/9.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/9.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/9.0/#sec-tostring',
+	ToUint16: 'https://262.ecma-international.org/9.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/9.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/9.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/9.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/9.0/#sec-triggerpromisereactions',
+	Type: 'https://262.ecma-international.org/9.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayCreate: 'https://262.ecma-international.org/9.0/#typedarray-create',
+	TypedArraySpeciesCreate: 'https://262.ecma-international.org/9.0/#typedarray-species-create',
+	UnicodeEscape: 'https://262.ecma-international.org/9.0/#sec-unicodeescape',
+	UnicodeMatchProperty: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-unicodematchproperty-p',
+	UnicodeMatchPropertyValue: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v',
+	UpdateEmpty: 'https://262.ecma-international.org/9.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/9.0/#sec-utc-t',
+	UTF16Decode: 'https://262.ecma-international.org/9.0/#sec-utf16decode',
+	UTF16Encoding: 'https://262.ecma-international.org/9.0/#sec-utf16encoding',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/9.0/#sec-validateandapplypropertydescriptor',
+	ValidateAtomicAccess: 'https://262.ecma-international.org/9.0/#sec-validateatomicaccess',
+	ValidateSharedIntegerTypedArray: 'https://262.ecma-international.org/9.0/#sec-validatesharedintegertypedarray',
+	ValidateTypedArray: 'https://262.ecma-international.org/9.0/#sec-validatetypedarray',
+	ValueOfReadEvent: 'https://262.ecma-international.org/9.0/#sec-valueofreadevent',
+	WakeWaiter: 'https://262.ecma-international.org/9.0/#sec-wakewaiter',
+	WeekDay: 'https://262.ecma-international.org/9.0/#sec-week-day',
+	WordCharacters: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
+	YearFromTime: 'https://262.ecma-international.org/9.0/#eqn-YearFromTime'
+};
diff --git a/node_modules/es-abstract/operations/2019.js b/node_modules/es-abstract/operations/2019.js
new file mode 100644
index 0000000..57a4be4
--- /dev/null
+++ b/node_modules/es-abstract/operations/2019.js
@@ -0,0 +1,355 @@
+'use strict';
+
+module.exports = {
+	abs: 'https://262.ecma-international.org/10.0/#eqn-abs',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/10.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/10.0/#sec-abstract-relational-comparison',
+	AddEntriesFromIterable: 'https://262.ecma-international.org/10.0/#sec-add-entries-from-iterable',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/10.0/#sec-addrestrictedfunctionproperties',
+	AddWaiter: 'https://262.ecma-international.org/10.0/#sec-addwaiter',
+	AdvanceStringIndex: 'https://262.ecma-international.org/10.0/#sec-advancestringindex',
+	'agent-order': 'https://262.ecma-international.org/10.0/#sec-agent-order',
+	AgentCanSuspend: 'https://262.ecma-international.org/10.0/#sec-agentcansuspend',
+	AgentSignifier: 'https://262.ecma-international.org/10.0/#sec-agentsignifier',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-allocatearraybuffer',
+	AllocateSharedArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-allocatesharedarraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/10.0/#sec-allocatetypedarray',
+	AllocateTypedArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-allocatetypedarraybuffer',
+	ArrayCreate: 'https://262.ecma-international.org/10.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/10.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/10.0/#sec-arrayspeciescreate',
+	AsyncFromSyncIteratorContinuation: 'https://262.ecma-international.org/10.0/#sec-asyncfromsynciteratorcontinuation',
+	AsyncFunctionCreate: 'https://262.ecma-international.org/10.0/#sec-async-functions-abstract-operations-async-function-create',
+	AsyncFunctionStart: 'https://262.ecma-international.org/10.0/#sec-async-functions-abstract-operations-async-function-start',
+	AsyncGeneratorEnqueue: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorenqueue',
+	AsyncGeneratorFunctionCreate: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorfunctioncreate',
+	AsyncGeneratorReject: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorreject',
+	AsyncGeneratorResolve: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorresolve',
+	AsyncGeneratorResumeNext: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorresumenext',
+	AsyncGeneratorStart: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorstart',
+	AsyncGeneratorYield: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratoryield',
+	AsyncIteratorClose: 'https://262.ecma-international.org/10.0/#sec-asynciteratorclose',
+	AtomicLoad: 'https://262.ecma-international.org/10.0/#sec-atomicload',
+	AtomicReadModifyWrite: 'https://262.ecma-international.org/10.0/#sec-atomicreadmodifywrite',
+	Await: 'https://262.ecma-international.org/10.0/#await',
+	BackreferenceMatcher: 'https://262.ecma-international.org/10.0/#sec-backreference-matcher',
+	BlockDeclarationInstantiation: 'https://262.ecma-international.org/10.0/#sec-blockdeclarationinstantiation',
+	BoundFunctionCreate: 'https://262.ecma-international.org/10.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/10.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/10.0/#sec-canonicalnumericindexstring',
+	CaseClauseIsSelected: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-caseclauseisselected',
+	CharacterRange: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterRangeOrUnion: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-clonearraybuffer',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/10.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/10.0/#sec-completion-record-specification-type',
+	ComposeWriteEventBytes: 'https://262.ecma-international.org/10.0/#sec-composewriteeventbytes',
+	Construct: 'https://262.ecma-international.org/10.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/10.0/#sec-copydatablockbytes',
+	CopyDataProperties: 'https://262.ecma-international.org/10.0/#sec-copydataproperties',
+	CreateArrayFromList: 'https://262.ecma-international.org/10.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/10.0/#sec-createarrayiterator',
+	CreateAsyncFromSyncIterator: 'https://262.ecma-international.org/10.0/#sec-createasyncfromsynciterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/10.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/10.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/10.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/10.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/10.0/#sec-createdynamicfunction',
+	CreateHTML: 'https://262.ecma-international.org/10.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/10.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/10.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/10.0/#sec-createlistfromarraylike',
+	CreateListIteratorRecord: 'https://262.ecma-international.org/10.0/#sec-createlistiteratorRecord',
+	CreateMapIterator: 'https://262.ecma-international.org/10.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/10.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/10.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/10.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/10.0/#sec-createrealm',
+	CreateResolvingFunctions: 'https://262.ecma-international.org/10.0/#sec-createresolvingfunctions',
+	CreateSetIterator: 'https://262.ecma-international.org/10.0/#sec-createsetiterator',
+	CreateSharedByteDataBlock: 'https://262.ecma-international.org/10.0/#sec-createsharedbytedatablock',
+	CreateStringIterator: 'https://262.ecma-international.org/10.0/#sec-createstringiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/10.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/10.0/#sec-date-number',
+	DateString: 'https://262.ecma-international.org/10.0/#sec-datestring',
+	Day: 'https://262.ecma-international.org/10.0/#eqn-Day',
+	DayFromYear: 'https://262.ecma-international.org/10.0/#eqn-DaysFromYear',
+	DaysInYear: 'https://262.ecma-international.org/10.0/#eqn-DaysInYear',
+	DayWithinYear: 'https://262.ecma-international.org/10.0/#eqn-DayWithinYear',
+	Decode: 'https://262.ecma-international.org/10.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/10.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/10.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/10.0/#sec-encode',
+	EnqueueJob: 'https://262.ecma-international.org/10.0/#sec-enqueuejob',
+	EnterCriticalSection: 'https://262.ecma-international.org/10.0/#sec-entercriticalsection',
+	EnumerableOwnPropertyNames: 'https://262.ecma-international.org/10.0/#sec-enumerableownpropertynames',
+	EnumerateObjectProperties: 'https://262.ecma-international.org/10.0/#sec-enumerate-object-properties',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/10.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/10.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/10.0/#sec-evaluatecall',
+	EvaluateNew: 'https://262.ecma-international.org/10.0/#sec-evaluatenew',
+	EventSet: 'https://262.ecma-international.org/10.0/#sec-event-set',
+	ExecuteModule: 'https://262.ecma-international.org/10.0/#sec-source-text-module-record-execute-module',
+	FlattenIntoArray: 'https://262.ecma-international.org/10.0/#sec-flattenintoarray',
+	floor: 'https://262.ecma-international.org/10.0/#eqn-floor',
+	ForBodyEvaluation: 'https://262.ecma-international.org/10.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/10.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/10.0/#sec-fulfillpromise',
+	FunctionAllocate: 'https://262.ecma-international.org/10.0/#sec-functionallocate',
+	FunctionCreate: 'https://262.ecma-international.org/10.0/#sec-functioncreate',
+	FunctionDeclarationInstantiation: 'https://262.ecma-international.org/10.0/#sec-functiondeclarationinstantiation',
+	FunctionInitialize: 'https://262.ecma-international.org/10.0/#sec-functioninitialize',
+	GeneratorFunctionCreate: 'https://262.ecma-international.org/10.0/#sec-generatorfunctioncreate',
+	GeneratorResume: 'https://262.ecma-international.org/10.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/10.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/10.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/10.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/10.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/10.0/#sec-get-o-p',
+	GetActiveScriptOrModule: 'https://262.ecma-international.org/10.0/#sec-getactivescriptormodule',
+	GetBase: 'https://262.ecma-international.org/10.0/#sec-getbase',
+	GetFunctionRealm: 'https://262.ecma-international.org/10.0/#sec-getfunctionrealm',
+	GetGeneratorKind: 'https://262.ecma-international.org/10.0/#sec-getgeneratorkind',
+	GetGlobalObject: 'https://262.ecma-international.org/10.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/10.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/10.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/10.0/#sec-getmethod',
+	GetModifySetValueInBuffer: 'https://262.ecma-international.org/10.0/#sec-getmodifysetvalueinbuffer',
+	GetModuleNamespace: 'https://262.ecma-international.org/10.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/10.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/10.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/10.0/#sec-getprototypefromconstructor',
+	GetReferencedName: 'https://262.ecma-international.org/10.0/#sec-getreferencedname',
+	GetSubstitution: 'https://262.ecma-international.org/10.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/10.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/10.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/10.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/10.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/10.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/10.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/10.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/10.0/#sec-getviewvalue',
+	GetWaiterList: 'https://262.ecma-international.org/10.0/#sec-getwaiterlist',
+	GlobalDeclarationInstantiation: 'https://262.ecma-international.org/10.0/#sec-globaldeclarationinstantiation',
+	'happens-before': 'https://262.ecma-international.org/10.0/#sec-happens-before',
+	HasOwnProperty: 'https://262.ecma-international.org/10.0/#sec-hasownproperty',
+	HasPrimitiveBase: 'https://262.ecma-international.org/10.0/#sec-hasprimitivebase',
+	HasProperty: 'https://262.ecma-international.org/10.0/#sec-hasproperty',
+	'host-synchronizes-with': 'https://262.ecma-international.org/10.0/#sec-host-synchronizes-with',
+	HostEnsureCanCompileStrings: 'https://262.ecma-international.org/10.0/#sec-hostensurecancompilestrings',
+	HostEventSet: 'https://262.ecma-international.org/10.0/#sec-hosteventset',
+	HostPromiseRejectionTracker: 'https://262.ecma-international.org/10.0/#sec-host-promise-rejection-tracker',
+	HostReportErrors: 'https://262.ecma-international.org/10.0/#sec-host-report-errors',
+	HostResolveImportedModule: 'https://262.ecma-international.org/10.0/#sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/10.0/#eqn-HourFromTime',
+	IfAbruptRejectPromise: 'https://262.ecma-international.org/10.0/#sec-ifabruptrejectpromise',
+	ImportedLocalNames: 'https://262.ecma-international.org/10.0/#sec-importedlocalnames',
+	InitializeBoundName: 'https://262.ecma-international.org/10.0/#sec-initializeboundname',
+	InitializeEnvironment: 'https://262.ecma-international.org/10.0/#sec-source-text-module-record-initialize-environment',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/10.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/10.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/10.0/#eqn-InLeapYear',
+	InnerModuleEvaluation: 'https://262.ecma-international.org/10.0/#sec-innermoduleevaluation',
+	InnerModuleInstantiation: 'https://262.ecma-international.org/10.0/#sec-innermoduleinstantiation',
+	InstanceofOperator: 'https://262.ecma-international.org/10.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/10.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/10.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/10.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/10.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/10.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/10.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/10.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/10.0/#sec-isarray',
+	IsCallable: 'https://262.ecma-international.org/10.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/10.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/10.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/10.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/10.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/10.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/10.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/10.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/10.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/10.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/10.0/#sec-islabelledfunction',
+	IsPromise: 'https://262.ecma-international.org/10.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/10.0/#sec-ispropertykey',
+	IsPropertyReference: 'https://262.ecma-international.org/10.0/#sec-ispropertyreference',
+	IsRegExp: 'https://262.ecma-international.org/10.0/#sec-isregexp',
+	IsSharedArrayBuffer: 'https://262.ecma-international.org/10.0/#sec-issharedarraybuffer',
+	IsStrictReference: 'https://262.ecma-international.org/10.0/#sec-isstrictreference',
+	IsStringPrefix: 'https://262.ecma-international.org/10.0/#sec-isstringprefix',
+	IsSuperReference: 'https://262.ecma-international.org/10.0/#sec-issuperreference',
+	IsUnresolvableReference: 'https://262.ecma-international.org/10.0/#sec-isunresolvablereference',
+	IsWordChar: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IterableToList: 'https://262.ecma-international.org/10.0/#sec-iterabletolist',
+	IteratorClose: 'https://262.ecma-international.org/10.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/10.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/10.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/10.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/10.0/#sec-iteratorvalue',
+	LeaveCriticalSection: 'https://262.ecma-international.org/10.0/#sec-leavecriticalsection',
+	LocalTime: 'https://262.ecma-international.org/10.0/#sec-localtime',
+	LoopContinues: 'https://262.ecma-international.org/10.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/10.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/10.0/#sec-makeargsetter',
+	MakeClassConstructor: 'https://262.ecma-international.org/10.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/10.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/10.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/10.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/10.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/10.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/10.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/10.0/#eqn-max',
+	'memory-order': 'https://262.ecma-international.org/10.0/#sec-memory-order',
+	min: 'https://262.ecma-international.org/10.0/#eqn-min',
+	MinFromTime: 'https://262.ecma-international.org/10.0/#eqn-MinFromTime',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/10.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/10.0/#eqn-modulo',
+	MonthFromTime: 'https://262.ecma-international.org/10.0/#eqn-MonthFromTime',
+	msFromTime: 'https://262.ecma-international.org/10.0/#eqn-msFromTime',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/10.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/10.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/10.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/10.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/10.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/10.0/#sec-newpromisecapability',
+	NormalCompletion: 'https://262.ecma-international.org/10.0/#sec-normalcompletion',
+	NotifyWaiter: 'https://262.ecma-international.org/10.0/#sec-notifywaiter',
+	NumberToRawBytes: 'https://262.ecma-international.org/10.0/#sec-numbertorawbytes',
+	NumberToString: 'https://262.ecma-international.org/10.0/#sec-tostring-applied-to-the-number-type',
+	ObjectCreate: 'https://262.ecma-international.org/10.0/#sec-objectcreate',
+	ObjectDefineProperties: 'https://262.ecma-international.org/10.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/10.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/10.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/10.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/10.0/#sec-ordinarydefineownproperty',
+	OrdinaryDelete: 'https://262.ecma-international.org/10.0/#sec-ordinarydelete',
+	OrdinaryGet: 'https://262.ecma-international.org/10.0/#sec-ordinaryget',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/10.0/#sec-ordinarygetownproperty',
+	OrdinaryGetPrototypeOf: 'https://262.ecma-international.org/10.0/#sec-ordinarygetprototypeof',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/10.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/10.0/#sec-ordinaryhasproperty',
+	OrdinaryIsExtensible: 'https://262.ecma-international.org/10.0/#sec-ordinaryisextensible',
+	OrdinaryOwnPropertyKeys: 'https://262.ecma-international.org/10.0/#sec-ordinaryownpropertykeys',
+	OrdinaryPreventExtensions: 'https://262.ecma-international.org/10.0/#sec-ordinarypreventextensions',
+	OrdinarySet: 'https://262.ecma-international.org/10.0/#sec-ordinaryset',
+	OrdinarySetPrototypeOf: 'https://262.ecma-international.org/10.0/#sec-ordinarysetprototypeof',
+	OrdinarySetWithOwnDescriptor: 'https://262.ecma-international.org/10.0/#sec-ordinarysetwithowndescriptor',
+	OrdinaryToPrimitive: 'https://262.ecma-international.org/10.0/#sec-ordinarytoprimitive',
+	ParseModule: 'https://262.ecma-international.org/10.0/#sec-parsemodule',
+	ParseScript: 'https://262.ecma-international.org/10.0/#sec-parse-script',
+	PerformEval: 'https://262.ecma-international.org/10.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/10.0/#sec-performpromiseall',
+	PerformPromiseRace: 'https://262.ecma-international.org/10.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/10.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/10.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/10.0/#sec-preparefortailcall',
+	PromiseReactionJob: 'https://262.ecma-international.org/10.0/#sec-promisereactionjob',
+	PromiseResolve: 'https://262.ecma-international.org/10.0/#sec-promise-resolve',
+	PromiseResolveThenableJob: 'https://262.ecma-international.org/10.0/#sec-promiseresolvethenablejob',
+	ProxyCreate: 'https://262.ecma-international.org/10.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/10.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/10.0/#sec-quotejsonstring',
+	RawBytesToNumber: 'https://262.ecma-international.org/10.0/#sec-rawbytestonumber',
+	'reads-bytes-from': 'https://262.ecma-international.org/10.0/#sec-reads-bytes-from',
+	'reads-from': 'https://262.ecma-international.org/10.0/#sec-reads-from',
+	RegExpAlloc: 'https://262.ecma-international.org/10.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/10.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/10.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/10.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/10.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/10.0/#sec-rejectpromise',
+	RemoveWaiter: 'https://262.ecma-international.org/10.0/#sec-removewaiter',
+	RemoveWaiters: 'https://262.ecma-international.org/10.0/#sec-removewaiters',
+	RepeatMatcher: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireObjectCoercible: 'https://262.ecma-international.org/10.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/10.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/10.0/#sec-resolvethisbinding',
+	ReturnIfAbrupt: 'https://262.ecma-international.org/10.0/#sec-returnifabrupt',
+	RunJobs: 'https://262.ecma-international.org/10.0/#sec-runjobs',
+	SameValue: 'https://262.ecma-international.org/10.0/#sec-samevalue',
+	SameValueNonNumber: 'https://262.ecma-international.org/10.0/#sec-samevaluenonnumber',
+	SameValueZero: 'https://262.ecma-international.org/10.0/#sec-samevaluezero',
+	ScriptEvaluation: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-scriptevaluation',
+	ScriptEvaluationJob: 'https://262.ecma-international.org/10.0/#sec-scriptevaluationjob',
+	SecFromTime: 'https://262.ecma-international.org/10.0/#eqn-SecFromTime',
+	SerializeJSONArray: 'https://262.ecma-international.org/10.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/10.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/10.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/10.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/10.0/#sec-setdefaultglobalbindings',
+	SetFunctionLength: 'https://262.ecma-international.org/10.0/#sec-setfunctionlength',
+	SetFunctionName: 'https://262.ecma-international.org/10.0/#sec-setfunctionname',
+	SetImmutablePrototype: 'https://262.ecma-international.org/10.0/#sec-set-immutable-prototype',
+	SetIntegrityLevel: 'https://262.ecma-international.org/10.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/10.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/10.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/10.0/#sec-setviewvalue',
+	SharedDataBlockEventSet: 'https://262.ecma-international.org/10.0/#sec-sharedatablockeventset',
+	SortCompare: 'https://262.ecma-international.org/10.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/10.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/10.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/10.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/10.0/#sec-stringcreate',
+	StringGetOwnProperty: 'https://262.ecma-international.org/10.0/#sec-stringgetownproperty',
+	Suspend: 'https://262.ecma-international.org/10.0/#sec-suspend',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/10.0/#sec-symboldescriptivestring',
+	SynchronizeEventSet: 'https://262.ecma-international.org/10.0/#sec-synchronizeeventset',
+	'synchronizes-with': 'https://262.ecma-international.org/10.0/#sec-synchronizes-with',
+	TestIntegrityLevel: 'https://262.ecma-international.org/10.0/#sec-testintegritylevel',
+	thisBooleanValue: 'https://262.ecma-international.org/10.0/#sec-thisbooleanvalue',
+	thisNumberValue: 'https://262.ecma-international.org/10.0/#sec-thisnumbervalue',
+	thisStringValue: 'https://262.ecma-international.org/10.0/#sec-thisstringvalue',
+	thisSymbolValue: 'https://262.ecma-international.org/10.0/#sec-thissymbolvalue',
+	thisTimeValue: 'https://262.ecma-international.org/10.0/#sec-thistimevalue',
+	ThrowCompletion: 'https://262.ecma-international.org/10.0/#sec-throwcompletion',
+	TimeClip: 'https://262.ecma-international.org/10.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/10.0/#eqn-TimeFromYear',
+	TimeString: 'https://262.ecma-international.org/10.0/#sec-timestring',
+	TimeWithinDay: 'https://262.ecma-international.org/10.0/#eqn-TimeWithinDay',
+	TimeZoneString: 'https://262.ecma-international.org/10.0/#sec-timezoneestring',
+	ToBoolean: 'https://262.ecma-international.org/10.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/10.0/#sec-todatestring',
+	ToIndex: 'https://262.ecma-international.org/10.0/#sec-toindex',
+	ToInt16: 'https://262.ecma-international.org/10.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/10.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/10.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/10.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/10.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/10.0/#sec-tonumber',
+	ToObject: 'https://262.ecma-international.org/10.0/#sec-toobject',
+	TopLevelModuleEvaluationJob: 'https://262.ecma-international.org/10.0/#sec-toplevelmoduleevaluationjob',
+	ToPrimitive: 'https://262.ecma-international.org/10.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/10.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/10.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/10.0/#sec-tostring',
+	ToUint16: 'https://262.ecma-international.org/10.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/10.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/10.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/10.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/10.0/#sec-triggerpromisereactions',
+	TrimString: 'https://262.ecma-international.org/10.0/#sec-trimstring',
+	Type: 'https://262.ecma-international.org/10.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayCreate: 'https://262.ecma-international.org/10.0/#typedarray-create',
+	TypedArraySpeciesCreate: 'https://262.ecma-international.org/10.0/#typedarray-species-create',
+	UnicodeEscape: 'https://262.ecma-international.org/10.0/#sec-unicodeescape',
+	UnicodeMatchProperty: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-unicodematchproperty-p',
+	UnicodeMatchPropertyValue: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v',
+	UpdateEmpty: 'https://262.ecma-international.org/10.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/10.0/#sec-utc-t',
+	UTF16Decode: 'https://262.ecma-international.org/10.0/#sec-utf16decode',
+	UTF16Encoding: 'https://262.ecma-international.org/10.0/#sec-utf16encoding',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/10.0/#sec-validateandapplypropertydescriptor',
+	ValidateAtomicAccess: 'https://262.ecma-international.org/10.0/#sec-validateatomicaccess',
+	ValidateSharedIntegerTypedArray: 'https://262.ecma-international.org/10.0/#sec-validatesharedintegertypedarray',
+	ValidateTypedArray: 'https://262.ecma-international.org/10.0/#sec-validatetypedarray',
+	ValueOfReadEvent: 'https://262.ecma-international.org/10.0/#sec-valueofreadevent',
+	WeekDay: 'https://262.ecma-international.org/10.0/#sec-week-day',
+	WordCharacters: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
+	YearFromTime: 'https://262.ecma-international.org/10.0/#eqn-YearFromTime'
+};
diff --git a/node_modules/es-abstract/operations/2020.js b/node_modules/es-abstract/operations/2020.js
new file mode 100644
index 0000000..9464726
--- /dev/null
+++ b/node_modules/es-abstract/operations/2020.js
@@ -0,0 +1,418 @@
+'use strict';
+
+module.exports = {
+	abs: 'https://262.ecma-international.org/11.0/#eqn-abs',
+	'Abstract Equality Comparison': 'https://262.ecma-international.org/11.0/#sec-abstract-equality-comparison',
+	'Abstract Relational Comparison': 'https://262.ecma-international.org/11.0/#sec-abstract-relational-comparison',
+	AddEntriesFromIterable: 'https://262.ecma-international.org/11.0/#sec-add-entries-from-iterable',
+	AddRestrictedFunctionProperties: 'https://262.ecma-international.org/11.0/#sec-addrestrictedfunctionproperties',
+	AddWaiter: 'https://262.ecma-international.org/11.0/#sec-addwaiter',
+	AdvanceStringIndex: 'https://262.ecma-international.org/11.0/#sec-advancestringindex',
+	'agent-order': 'https://262.ecma-international.org/11.0/#sec-agent-order',
+	AgentCanSuspend: 'https://262.ecma-international.org/11.0/#sec-agentcansuspend',
+	AgentSignifier: 'https://262.ecma-international.org/11.0/#sec-agentsignifier',
+	AllocateArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-allocatearraybuffer',
+	AllocateSharedArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-allocatesharedarraybuffer',
+	AllocateTypedArray: 'https://262.ecma-international.org/11.0/#sec-allocatetypedarray',
+	AllocateTypedArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-allocatetypedarraybuffer',
+	ArrayCreate: 'https://262.ecma-international.org/11.0/#sec-arraycreate',
+	ArraySetLength: 'https://262.ecma-international.org/11.0/#sec-arraysetlength',
+	ArraySpeciesCreate: 'https://262.ecma-international.org/11.0/#sec-arrayspeciescreate',
+	AsyncFromSyncIteratorContinuation: 'https://262.ecma-international.org/11.0/#sec-asyncfromsynciteratorcontinuation',
+	AsyncFunctionStart: 'https://262.ecma-international.org/11.0/#sec-async-functions-abstract-operations-async-function-start',
+	AsyncGeneratorEnqueue: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorenqueue',
+	AsyncGeneratorReject: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorreject',
+	AsyncGeneratorResolve: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorresolve',
+	AsyncGeneratorResumeNext: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorresumenext',
+	AsyncGeneratorStart: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorstart',
+	AsyncGeneratorYield: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratoryield',
+	AsyncIteratorClose: 'https://262.ecma-international.org/11.0/#sec-asynciteratorclose',
+	AtomicLoad: 'https://262.ecma-international.org/11.0/#sec-atomicload',
+	AtomicReadModifyWrite: 'https://262.ecma-international.org/11.0/#sec-atomicreadmodifywrite',
+	Await: 'https://262.ecma-international.org/11.0/#await',
+	BackreferenceMatcher: 'https://262.ecma-international.org/11.0/#sec-backreference-matcher',
+	'BigInt::add': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add',
+	'BigInt::bitwiseAND': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND',
+	'BigInt::bitwiseNOT': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT',
+	'BigInt::bitwiseOR': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR',
+	'BigInt::bitwiseXOR': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR',
+	'BigInt::divide': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide',
+	'BigInt::equal': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal',
+	'BigInt::exponentiate': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate',
+	'BigInt::leftShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift',
+	'BigInt::lessThan': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan',
+	'BigInt::multiply': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply',
+	'BigInt::remainder': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder',
+	'BigInt::sameValue': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue',
+	'BigInt::sameValueZero': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero',
+	'BigInt::signedRightShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift',
+	'BigInt::subtract': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract',
+	'BigInt::toString': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring',
+	'BigInt::unaryMinus': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus',
+	'BigInt::unsignedRightShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift',
+	BigIntBitwiseOp: 'https://262.ecma-international.org/11.0/#sec-bigintbitwiseop',
+	BinaryAnd: 'https://262.ecma-international.org/11.0/#sec-binaryand',
+	BinaryOr: 'https://262.ecma-international.org/11.0/#sec-binaryor',
+	BinaryXor: 'https://262.ecma-international.org/11.0/#sec-binaryxor',
+	BlockDeclarationInstantiation: 'https://262.ecma-international.org/11.0/#sec-blockdeclarationinstantiation',
+	BoundFunctionCreate: 'https://262.ecma-international.org/11.0/#sec-boundfunctioncreate',
+	Call: 'https://262.ecma-international.org/11.0/#sec-call',
+	Canonicalize: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-canonicalize-ch',
+	CanonicalNumericIndexString: 'https://262.ecma-international.org/11.0/#sec-canonicalnumericindexstring',
+	CaseClauseIsSelected: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-caseclauseisselected',
+	CharacterRange: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-characterrange-abstract-operation',
+	CharacterRangeOrUnion: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
+	CharacterSetMatcher: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
+	CloneArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-clonearraybuffer',
+	CodePointAt: 'https://262.ecma-international.org/11.0/#sec-codepointat',
+	CompletePropertyDescriptor: 'https://262.ecma-international.org/11.0/#sec-completepropertydescriptor',
+	Completion: 'https://262.ecma-international.org/11.0/#sec-completion-record-specification-type',
+	ComposeWriteEventBytes: 'https://262.ecma-international.org/11.0/#sec-composewriteeventbytes',
+	Construct: 'https://262.ecma-international.org/11.0/#sec-construct',
+	CopyDataBlockBytes: 'https://262.ecma-international.org/11.0/#sec-copydatablockbytes',
+	CopyDataProperties: 'https://262.ecma-international.org/11.0/#sec-copydataproperties',
+	CreateArrayFromList: 'https://262.ecma-international.org/11.0/#sec-createarrayfromlist',
+	CreateArrayIterator: 'https://262.ecma-international.org/11.0/#sec-createarrayiterator',
+	CreateAsyncFromSyncIterator: 'https://262.ecma-international.org/11.0/#sec-createasyncfromsynciterator',
+	CreateBuiltinFunction: 'https://262.ecma-international.org/11.0/#sec-createbuiltinfunction',
+	CreateByteDataBlock: 'https://262.ecma-international.org/11.0/#sec-createbytedatablock',
+	CreateDataProperty: 'https://262.ecma-international.org/11.0/#sec-createdataproperty',
+	CreateDataPropertyOrThrow: 'https://262.ecma-international.org/11.0/#sec-createdatapropertyorthrow',
+	CreateDynamicFunction: 'https://262.ecma-international.org/11.0/#sec-createdynamicfunction',
+	CreateForInIterator: 'https://262.ecma-international.org/11.0/#sec-createforiniterator',
+	CreateHTML: 'https://262.ecma-international.org/11.0/#sec-createhtml',
+	CreateIntrinsics: 'https://262.ecma-international.org/11.0/#sec-createintrinsics',
+	CreateIterResultObject: 'https://262.ecma-international.org/11.0/#sec-createiterresultobject',
+	CreateListFromArrayLike: 'https://262.ecma-international.org/11.0/#sec-createlistfromarraylike',
+	CreateListIteratorRecord: 'https://262.ecma-international.org/11.0/#sec-createlistiteratorRecord',
+	CreateMapIterator: 'https://262.ecma-international.org/11.0/#sec-createmapiterator',
+	CreateMappedArgumentsObject: 'https://262.ecma-international.org/11.0/#sec-createmappedargumentsobject',
+	CreateMethodProperty: 'https://262.ecma-international.org/11.0/#sec-createmethodproperty',
+	CreatePerIterationEnvironment: 'https://262.ecma-international.org/11.0/#sec-createperiterationenvironment',
+	CreateRealm: 'https://262.ecma-international.org/11.0/#sec-createrealm',
+	CreateRegExpStringIterator: 'https://262.ecma-international.org/11.0/#sec-createregexpstringiterator',
+	CreateResolvingFunctions: 'https://262.ecma-international.org/11.0/#sec-createresolvingfunctions',
+	CreateSetIterator: 'https://262.ecma-international.org/11.0/#sec-createsetiterator',
+	CreateSharedByteDataBlock: 'https://262.ecma-international.org/11.0/#sec-createsharedbytedatablock',
+	CreateStringIterator: 'https://262.ecma-international.org/11.0/#sec-createstringiterator',
+	CreateUnmappedArgumentsObject: 'https://262.ecma-international.org/11.0/#sec-createunmappedargumentsobject',
+	DateFromTime: 'https://262.ecma-international.org/11.0/#sec-date-number',
+	DateString: 'https://262.ecma-international.org/11.0/#sec-datestring',
+	Day: 'https://262.ecma-international.org/11.0/#eqn-Day',
+	DayFromYear: 'https://262.ecma-international.org/11.0/#eqn-DaysFromYear',
+	DaysInYear: 'https://262.ecma-international.org/11.0/#eqn-DaysInYear',
+	DayWithinYear: 'https://262.ecma-international.org/11.0/#eqn-DayWithinYear',
+	Decode: 'https://262.ecma-international.org/11.0/#sec-decode',
+	DefinePropertyOrThrow: 'https://262.ecma-international.org/11.0/#sec-definepropertyorthrow',
+	DeletePropertyOrThrow: 'https://262.ecma-international.org/11.0/#sec-deletepropertyorthrow',
+	DetachArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-detacharraybuffer',
+	Encode: 'https://262.ecma-international.org/11.0/#sec-encode',
+	EnterCriticalSection: 'https://262.ecma-international.org/11.0/#sec-entercriticalsection',
+	EnumerableOwnPropertyNames: 'https://262.ecma-international.org/11.0/#sec-enumerableownpropertynames',
+	EnumerateObjectProperties: 'https://262.ecma-international.org/11.0/#sec-enumerate-object-properties',
+	EscapeRegExpPattern: 'https://262.ecma-international.org/11.0/#sec-escaperegexppattern',
+	EvalDeclarationInstantiation: 'https://262.ecma-international.org/11.0/#sec-evaldeclarationinstantiation',
+	EvaluateCall: 'https://262.ecma-international.org/11.0/#sec-evaluatecall',
+	EvaluateNew: 'https://262.ecma-international.org/11.0/#sec-evaluatenew',
+	EvaluatePropertyAccessWithExpressionKey: 'https://262.ecma-international.org/11.0/#sec-evaluate-property-access-with-expression-key',
+	EvaluatePropertyAccessWithIdentifierKey: 'https://262.ecma-international.org/11.0/#sec-evaluate-property-access-with-identifier-key',
+	EventSet: 'https://262.ecma-international.org/11.0/#sec-event-set',
+	ExecuteModule: 'https://262.ecma-international.org/11.0/#sec-source-text-module-record-execute-module',
+	FinishDynamicImport: 'https://262.ecma-international.org/11.0/#sec-finishdynamicimport',
+	FlattenIntoArray: 'https://262.ecma-international.org/11.0/#sec-flattenintoarray',
+	floor: 'https://262.ecma-international.org/11.0/#eqn-floor',
+	ForBodyEvaluation: 'https://262.ecma-international.org/11.0/#sec-forbodyevaluation',
+	'ForIn/OfBodyEvaluation': 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
+	'ForIn/OfHeadEvaluation': 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-forinofheadevaluation',
+	FromPropertyDescriptor: 'https://262.ecma-international.org/11.0/#sec-frompropertydescriptor',
+	FulfillPromise: 'https://262.ecma-international.org/11.0/#sec-fulfillpromise',
+	FunctionDeclarationInstantiation: 'https://262.ecma-international.org/11.0/#sec-functiondeclarationinstantiation',
+	GeneratorResume: 'https://262.ecma-international.org/11.0/#sec-generatorresume',
+	GeneratorResumeAbrupt: 'https://262.ecma-international.org/11.0/#sec-generatorresumeabrupt',
+	GeneratorStart: 'https://262.ecma-international.org/11.0/#sec-generatorstart',
+	GeneratorValidate: 'https://262.ecma-international.org/11.0/#sec-generatorvalidate',
+	GeneratorYield: 'https://262.ecma-international.org/11.0/#sec-generatoryield',
+	Get: 'https://262.ecma-international.org/11.0/#sec-get-o-p',
+	GetActiveScriptOrModule: 'https://262.ecma-international.org/11.0/#sec-getactivescriptormodule',
+	GetBase: 'https://262.ecma-international.org/11.0/#sec-getbase',
+	GetFunctionRealm: 'https://262.ecma-international.org/11.0/#sec-getfunctionrealm',
+	GetGeneratorKind: 'https://262.ecma-international.org/11.0/#sec-getgeneratorkind',
+	GetGlobalObject: 'https://262.ecma-international.org/11.0/#sec-getglobalobject',
+	GetIdentifierReference: 'https://262.ecma-international.org/11.0/#sec-getidentifierreference',
+	GetIterator: 'https://262.ecma-international.org/11.0/#sec-getiterator',
+	GetMethod: 'https://262.ecma-international.org/11.0/#sec-getmethod',
+	GetModifySetValueInBuffer: 'https://262.ecma-international.org/11.0/#sec-getmodifysetvalueinbuffer',
+	GetModuleNamespace: 'https://262.ecma-international.org/11.0/#sec-getmodulenamespace',
+	GetNewTarget: 'https://262.ecma-international.org/11.0/#sec-getnewtarget',
+	GetOwnPropertyKeys: 'https://262.ecma-international.org/11.0/#sec-getownpropertykeys',
+	GetPrototypeFromConstructor: 'https://262.ecma-international.org/11.0/#sec-getprototypefromconstructor',
+	GetReferencedName: 'https://262.ecma-international.org/11.0/#sec-getreferencedname',
+	GetSubstitution: 'https://262.ecma-international.org/11.0/#sec-getsubstitution',
+	GetSuperConstructor: 'https://262.ecma-international.org/11.0/#sec-getsuperconstructor',
+	GetTemplateObject: 'https://262.ecma-international.org/11.0/#sec-gettemplateobject',
+	GetThisEnvironment: 'https://262.ecma-international.org/11.0/#sec-getthisenvironment',
+	GetThisValue: 'https://262.ecma-international.org/11.0/#sec-getthisvalue',
+	GetV: 'https://262.ecma-international.org/11.0/#sec-getv',
+	GetValue: 'https://262.ecma-international.org/11.0/#sec-getvalue',
+	GetValueFromBuffer: 'https://262.ecma-international.org/11.0/#sec-getvaluefrombuffer',
+	GetViewValue: 'https://262.ecma-international.org/11.0/#sec-getviewvalue',
+	GetWaiterList: 'https://262.ecma-international.org/11.0/#sec-getwaiterlist',
+	GlobalDeclarationInstantiation: 'https://262.ecma-international.org/11.0/#sec-globaldeclarationinstantiation',
+	'happens-before': 'https://262.ecma-international.org/11.0/#sec-happens-before',
+	HasOwnProperty: 'https://262.ecma-international.org/11.0/#sec-hasownproperty',
+	HasPrimitiveBase: 'https://262.ecma-international.org/11.0/#sec-hasprimitivebase',
+	HasProperty: 'https://262.ecma-international.org/11.0/#sec-hasproperty',
+	'host-synchronizes-with': 'https://262.ecma-international.org/11.0/#sec-host-synchronizes-with',
+	HostEnqueuePromiseJob: 'https://262.ecma-international.org/11.0/#sec-hostenqueuepromisejob',
+	HostEnsureCanCompileStrings: 'https://262.ecma-international.org/11.0/#sec-hostensurecancompilestrings',
+	HostEventSet: 'https://262.ecma-international.org/11.0/#sec-hosteventset',
+	HostFinalizeImportMeta: 'https://262.ecma-international.org/11.0/#sec-hostfinalizeimportmeta',
+	HostGetImportMetaProperties: 'https://262.ecma-international.org/11.0/#sec-hostgetimportmetaproperties',
+	HostImportModuleDynamically: 'https://262.ecma-international.org/11.0/#sec-hostimportmoduledynamically',
+	HostPromiseRejectionTracker: 'https://262.ecma-international.org/11.0/#sec-host-promise-rejection-tracker',
+	HostResolveImportedModule: 'https://262.ecma-international.org/11.0/#sec-hostresolveimportedmodule',
+	HourFromTime: 'https://262.ecma-international.org/11.0/#eqn-HourFromTime',
+	IfAbruptRejectPromise: 'https://262.ecma-international.org/11.0/#sec-ifabruptrejectpromise',
+	ImportedLocalNames: 'https://262.ecma-international.org/11.0/#sec-importedlocalnames',
+	InitializeBoundName: 'https://262.ecma-international.org/11.0/#sec-initializeboundname',
+	InitializeEnvironment: 'https://262.ecma-international.org/11.0/#sec-source-text-module-record-initialize-environment',
+	InitializeHostDefinedRealm: 'https://262.ecma-international.org/11.0/#sec-initializehostdefinedrealm',
+	InitializeReferencedBinding: 'https://262.ecma-international.org/11.0/#sec-initializereferencedbinding',
+	InLeapYear: 'https://262.ecma-international.org/11.0/#eqn-InLeapYear',
+	InnerModuleEvaluation: 'https://262.ecma-international.org/11.0/#sec-innermoduleevaluation',
+	InnerModuleLinking: 'https://262.ecma-international.org/11.0/#sec-InnerModuleLinking',
+	InstanceofOperator: 'https://262.ecma-international.org/11.0/#sec-instanceofoperator',
+	IntegerIndexedElementGet: 'https://262.ecma-international.org/11.0/#sec-integerindexedelementget',
+	IntegerIndexedElementSet: 'https://262.ecma-international.org/11.0/#sec-integerindexedelementset',
+	IntegerIndexedObjectCreate: 'https://262.ecma-international.org/11.0/#sec-integerindexedobjectcreate',
+	InternalizeJSONProperty: 'https://262.ecma-international.org/11.0/#sec-internalizejsonproperty',
+	Invoke: 'https://262.ecma-international.org/11.0/#sec-invoke',
+	IsAccessorDescriptor: 'https://262.ecma-international.org/11.0/#sec-isaccessordescriptor',
+	IsAnonymousFunctionDefinition: 'https://262.ecma-international.org/11.0/#sec-isanonymousfunctiondefinition',
+	IsArray: 'https://262.ecma-international.org/11.0/#sec-isarray',
+	IsBigIntElementType: 'https://262.ecma-international.org/11.0/#sec-isbigintelementtype',
+	IsCallable: 'https://262.ecma-international.org/11.0/#sec-iscallable',
+	IsCompatiblePropertyDescriptor: 'https://262.ecma-international.org/11.0/#sec-iscompatiblepropertydescriptor',
+	IsConcatSpreadable: 'https://262.ecma-international.org/11.0/#sec-isconcatspreadable',
+	IsConstructor: 'https://262.ecma-international.org/11.0/#sec-isconstructor',
+	IsDataDescriptor: 'https://262.ecma-international.org/11.0/#sec-isdatadescriptor',
+	IsDetachedBuffer: 'https://262.ecma-international.org/11.0/#sec-isdetachedbuffer',
+	IsExtensible: 'https://262.ecma-international.org/11.0/#sec-isextensible-o',
+	IsGenericDescriptor: 'https://262.ecma-international.org/11.0/#sec-isgenericdescriptor',
+	IsInTailPosition: 'https://262.ecma-international.org/11.0/#sec-isintailposition',
+	IsInteger: 'https://262.ecma-international.org/11.0/#sec-isinteger',
+	IsLabelledFunction: 'https://262.ecma-international.org/11.0/#sec-islabelledfunction',
+	IsNonNegativeInteger: 'https://262.ecma-international.org/11.0/#sec-isnonnegativeinteger',
+	IsNoTearConfiguration: 'https://262.ecma-international.org/11.0/#sec-isnotearconfiguration',
+	IsPromise: 'https://262.ecma-international.org/11.0/#sec-ispromise',
+	IsPropertyKey: 'https://262.ecma-international.org/11.0/#sec-ispropertykey',
+	IsPropertyReference: 'https://262.ecma-international.org/11.0/#sec-ispropertyreference',
+	IsRegExp: 'https://262.ecma-international.org/11.0/#sec-isregexp',
+	IsSharedArrayBuffer: 'https://262.ecma-international.org/11.0/#sec-issharedarraybuffer',
+	IsStrictReference: 'https://262.ecma-international.org/11.0/#sec-isstrictreference',
+	IsStringPrefix: 'https://262.ecma-international.org/11.0/#sec-isstringprefix',
+	IsSuperReference: 'https://262.ecma-international.org/11.0/#sec-issuperreference',
+	IsUnclampedIntegerElementType: 'https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype',
+	IsUnresolvableReference: 'https://262.ecma-international.org/11.0/#sec-isunresolvablereference',
+	IsUnsignedElementType: 'https://262.ecma-international.org/11.0/#sec-isunsignedelementtype',
+	IsValidIntegerIndex: 'https://262.ecma-international.org/11.0/#sec-isvalidintegerindex',
+	IsValidRegularExpressionLiteral: 'https://262.ecma-international.org/11.0/#sec-isvalidregularexpressionliteral',
+	IsWordChar: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-iswordchar-abstract-operation',
+	IterableToList: 'https://262.ecma-international.org/11.0/#sec-iterabletolist',
+	IteratorClose: 'https://262.ecma-international.org/11.0/#sec-iteratorclose',
+	IteratorComplete: 'https://262.ecma-international.org/11.0/#sec-iteratorcomplete',
+	IteratorNext: 'https://262.ecma-international.org/11.0/#sec-iteratornext',
+	IteratorStep: 'https://262.ecma-international.org/11.0/#sec-iteratorstep',
+	IteratorValue: 'https://262.ecma-international.org/11.0/#sec-iteratorvalue',
+	LeaveCriticalSection: 'https://262.ecma-international.org/11.0/#sec-leavecriticalsection',
+	LengthOfArrayLike: 'https://262.ecma-international.org/11.0/#sec-lengthofarraylike',
+	LocalTime: 'https://262.ecma-international.org/11.0/#sec-localtime',
+	LocalTZA: 'https://262.ecma-international.org/11.0/#sec-local-time-zone-adjustment',
+	LoopContinues: 'https://262.ecma-international.org/11.0/#sec-loopcontinues',
+	MakeArgGetter: 'https://262.ecma-international.org/11.0/#sec-makearggetter',
+	MakeArgSetter: 'https://262.ecma-international.org/11.0/#sec-makeargsetter',
+	MakeBasicObject: 'https://262.ecma-international.org/11.0/#sec-makebasicobject',
+	MakeClassConstructor: 'https://262.ecma-international.org/11.0/#sec-makeclassconstructor',
+	MakeConstructor: 'https://262.ecma-international.org/11.0/#sec-makeconstructor',
+	MakeDate: 'https://262.ecma-international.org/11.0/#sec-makedate',
+	MakeDay: 'https://262.ecma-international.org/11.0/#sec-makeday',
+	MakeMethod: 'https://262.ecma-international.org/11.0/#sec-makemethod',
+	MakeSuperPropertyReference: 'https://262.ecma-international.org/11.0/#sec-makesuperpropertyreference',
+	MakeTime: 'https://262.ecma-international.org/11.0/#sec-maketime',
+	max: 'https://262.ecma-international.org/11.0/#eqn-max',
+	'memory-order': 'https://262.ecma-international.org/11.0/#sec-memory-order',
+	min: 'https://262.ecma-international.org/11.0/#eqn-min',
+	MinFromTime: 'https://262.ecma-international.org/11.0/#eqn-MinFromTime',
+	ModuleNamespaceCreate: 'https://262.ecma-international.org/11.0/#sec-modulenamespacecreate',
+	modulo: 'https://262.ecma-international.org/11.0/#eqn-modulo',
+	MonthFromTime: 'https://262.ecma-international.org/11.0/#eqn-MonthFromTime',
+	msFromTime: 'https://262.ecma-international.org/11.0/#eqn-msFromTime',
+	NewDeclarativeEnvironment: 'https://262.ecma-international.org/11.0/#sec-newdeclarativeenvironment',
+	NewFunctionEnvironment: 'https://262.ecma-international.org/11.0/#sec-newfunctionenvironment',
+	NewGlobalEnvironment: 'https://262.ecma-international.org/11.0/#sec-newglobalenvironment',
+	NewModuleEnvironment: 'https://262.ecma-international.org/11.0/#sec-newmoduleenvironment',
+	NewObjectEnvironment: 'https://262.ecma-international.org/11.0/#sec-newobjectenvironment',
+	NewPromiseCapability: 'https://262.ecma-international.org/11.0/#sec-newpromisecapability',
+	NewPromiseReactionJob: 'https://262.ecma-international.org/11.0/#sec-newpromisereactionjob',
+	NewPromiseResolveThenableJob: 'https://262.ecma-international.org/11.0/#sec-newpromiseresolvethenablejob',
+	NormalCompletion: 'https://262.ecma-international.org/11.0/#sec-normalcompletion',
+	NotifyWaiter: 'https://262.ecma-international.org/11.0/#sec-notifywaiter',
+	'Number::add': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-add',
+	'Number::bitwiseAND': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND',
+	'Number::bitwiseNOT': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT',
+	'Number::bitwiseOR': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR',
+	'Number::bitwiseXOR': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR',
+	'Number::divide': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide',
+	'Number::equal': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal',
+	'Number::exponentiate': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate',
+	'Number::leftShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-leftShift',
+	'Number::lessThan': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan',
+	'Number::multiply': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply',
+	'Number::remainder': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-remainder',
+	'Number::sameValue': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue',
+	'Number::sameValueZero': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero',
+	'Number::signedRightShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-signedRightShift',
+	'Number::subtract': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-subtract',
+	'Number::toString': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring',
+	'Number::unaryMinus': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus',
+	'Number::unsignedRightShift': 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-unsignedRightShift',
+	NumberBitwiseOp: 'https://262.ecma-international.org/11.0/#sec-numberbitwiseop',
+	NumberToBigInt: 'https://262.ecma-international.org/11.0/#sec-numbertobigint',
+	NumericToRawBytes: 'https://262.ecma-international.org/11.0/#sec-numerictorawbytes',
+	ObjectDefineProperties: 'https://262.ecma-international.org/11.0/#sec-objectdefineproperties',
+	OrdinaryCallBindThis: 'https://262.ecma-international.org/11.0/#sec-ordinarycallbindthis',
+	OrdinaryCallEvaluateBody: 'https://262.ecma-international.org/11.0/#sec-ordinarycallevaluatebody',
+	OrdinaryCreateFromConstructor: 'https://262.ecma-international.org/11.0/#sec-ordinarycreatefromconstructor',
+	OrdinaryDefineOwnProperty: 'https://262.ecma-international.org/11.0/#sec-ordinarydefineownproperty',
+	OrdinaryDelete: 'https://262.ecma-international.org/11.0/#sec-ordinarydelete',
+	OrdinaryFunctionCreate: 'https://262.ecma-international.org/11.0/#sec-ordinaryfunctioncreate',
+	OrdinaryGet: 'https://262.ecma-international.org/11.0/#sec-ordinaryget',
+	OrdinaryGetOwnProperty: 'https://262.ecma-international.org/11.0/#sec-ordinarygetownproperty',
+	OrdinaryGetPrototypeOf: 'https://262.ecma-international.org/11.0/#sec-ordinarygetprototypeof',
+	OrdinaryHasInstance: 'https://262.ecma-international.org/11.0/#sec-ordinaryhasinstance',
+	OrdinaryHasProperty: 'https://262.ecma-international.org/11.0/#sec-ordinaryhasproperty',
+	OrdinaryIsExtensible: 'https://262.ecma-international.org/11.0/#sec-ordinaryisextensible',
+	OrdinaryObjectCreate: 'https://262.ecma-international.org/11.0/#sec-ordinaryobjectcreate',
+	OrdinaryOwnPropertyKeys: 'https://262.ecma-international.org/11.0/#sec-ordinaryownpropertykeys',
+	OrdinaryPreventExtensions: 'https://262.ecma-international.org/11.0/#sec-ordinarypreventextensions',
+	OrdinarySet: 'https://262.ecma-international.org/11.0/#sec-ordinaryset',
+	OrdinarySetPrototypeOf: 'https://262.ecma-international.org/11.0/#sec-ordinarysetprototypeof',
+	OrdinarySetWithOwnDescriptor: 'https://262.ecma-international.org/11.0/#sec-ordinarysetwithowndescriptor',
+	OrdinaryToPrimitive: 'https://262.ecma-international.org/11.0/#sec-ordinarytoprimitive',
+	ParseModule: 'https://262.ecma-international.org/11.0/#sec-parsemodule',
+	ParseScript: 'https://262.ecma-international.org/11.0/#sec-parse-script',
+	PerformEval: 'https://262.ecma-international.org/11.0/#sec-performeval',
+	PerformPromiseAll: 'https://262.ecma-international.org/11.0/#sec-performpromiseall',
+	PerformPromiseAllSettled: 'https://262.ecma-international.org/11.0/#sec-performpromiseallsettled',
+	PerformPromiseRace: 'https://262.ecma-international.org/11.0/#sec-performpromiserace',
+	PerformPromiseThen: 'https://262.ecma-international.org/11.0/#sec-performpromisethen',
+	PrepareForOrdinaryCall: 'https://262.ecma-international.org/11.0/#sec-prepareforordinarycall',
+	PrepareForTailCall: 'https://262.ecma-international.org/11.0/#sec-preparefortailcall',
+	PromiseResolve: 'https://262.ecma-international.org/11.0/#sec-promise-resolve',
+	ProxyCreate: 'https://262.ecma-international.org/11.0/#sec-proxycreate',
+	PutValue: 'https://262.ecma-international.org/11.0/#sec-putvalue',
+	QuoteJSONString: 'https://262.ecma-international.org/11.0/#sec-quotejsonstring',
+	RawBytesToNumeric: 'https://262.ecma-international.org/11.0/#sec-rawbytestonumeric',
+	'reads-bytes-from': 'https://262.ecma-international.org/11.0/#sec-reads-bytes-from',
+	'reads-from': 'https://262.ecma-international.org/11.0/#sec-reads-from',
+	RegExpAlloc: 'https://262.ecma-international.org/11.0/#sec-regexpalloc',
+	RegExpBuiltinExec: 'https://262.ecma-international.org/11.0/#sec-regexpbuiltinexec',
+	RegExpCreate: 'https://262.ecma-international.org/11.0/#sec-regexpcreate',
+	RegExpExec: 'https://262.ecma-international.org/11.0/#sec-regexpexec',
+	RegExpInitialize: 'https://262.ecma-international.org/11.0/#sec-regexpinitialize',
+	RejectPromise: 'https://262.ecma-international.org/11.0/#sec-rejectpromise',
+	RemoveWaiter: 'https://262.ecma-international.org/11.0/#sec-removewaiter',
+	RemoveWaiters: 'https://262.ecma-international.org/11.0/#sec-removewaiters',
+	RepeatMatcher: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
+	RequireInternalSlot: 'https://262.ecma-international.org/11.0/#sec-requireinternalslot',
+	RequireObjectCoercible: 'https://262.ecma-international.org/11.0/#sec-requireobjectcoercible',
+	ResolveBinding: 'https://262.ecma-international.org/11.0/#sec-resolvebinding',
+	ResolveThisBinding: 'https://262.ecma-international.org/11.0/#sec-resolvethisbinding',
+	ReturnIfAbrupt: 'https://262.ecma-international.org/11.0/#sec-returnifabrupt',
+	SameValue: 'https://262.ecma-international.org/11.0/#sec-samevalue',
+	SameValueNonNumeric: 'https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric',
+	SameValueZero: 'https://262.ecma-international.org/11.0/#sec-samevaluezero',
+	ScriptEvaluation: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-scriptevaluation',
+	SecFromTime: 'https://262.ecma-international.org/11.0/#eqn-SecFromTime',
+	SerializeJSONArray: 'https://262.ecma-international.org/11.0/#sec-serializejsonarray',
+	SerializeJSONObject: 'https://262.ecma-international.org/11.0/#sec-serializejsonobject',
+	SerializeJSONProperty: 'https://262.ecma-international.org/11.0/#sec-serializejsonproperty',
+	Set: 'https://262.ecma-international.org/11.0/#sec-set-o-p-v-throw',
+	SetDefaultGlobalBindings: 'https://262.ecma-international.org/11.0/#sec-setdefaultglobalbindings',
+	SetFunctionLength: 'https://262.ecma-international.org/11.0/#sec-setfunctionlength',
+	SetFunctionName: 'https://262.ecma-international.org/11.0/#sec-setfunctionname',
+	SetImmutablePrototype: 'https://262.ecma-international.org/11.0/#sec-set-immutable-prototype',
+	SetIntegrityLevel: 'https://262.ecma-international.org/11.0/#sec-setintegritylevel',
+	SetRealmGlobalObject: 'https://262.ecma-international.org/11.0/#sec-setrealmglobalobject',
+	SetValueInBuffer: 'https://262.ecma-international.org/11.0/#sec-setvalueinbuffer',
+	SetViewValue: 'https://262.ecma-international.org/11.0/#sec-setviewvalue',
+	SharedDataBlockEventSet: 'https://262.ecma-international.org/11.0/#sec-sharedatablockeventset',
+	SortCompare: 'https://262.ecma-international.org/11.0/#sec-sortcompare',
+	SpeciesConstructor: 'https://262.ecma-international.org/11.0/#sec-speciesconstructor',
+	SplitMatch: 'https://262.ecma-international.org/11.0/#sec-splitmatch',
+	'Strict Equality Comparison': 'https://262.ecma-international.org/11.0/#sec-strict-equality-comparison',
+	StringCreate: 'https://262.ecma-international.org/11.0/#sec-stringcreate',
+	StringGetOwnProperty: 'https://262.ecma-international.org/11.0/#sec-stringgetownproperty',
+	StringPad: 'https://262.ecma-international.org/11.0/#sec-stringpad',
+	StringToBigInt: 'https://262.ecma-international.org/11.0/#sec-stringtobigint',
+	Suspend: 'https://262.ecma-international.org/11.0/#sec-suspend',
+	SymbolDescriptiveString: 'https://262.ecma-international.org/11.0/#sec-symboldescriptivestring',
+	'synchronizes-with': 'https://262.ecma-international.org/11.0/#sec-synchronizes-with',
+	TestIntegrityLevel: 'https://262.ecma-international.org/11.0/#sec-testintegritylevel',
+	thisBigIntValue: 'https://262.ecma-international.org/11.0/#sec-thisbigintvalue',
+	thisBooleanValue: 'https://262.ecma-international.org/11.0/#sec-thisbooleanvalue',
+	thisNumberValue: 'https://262.ecma-international.org/11.0/#sec-thisnumbervalue',
+	thisStringValue: 'https://262.ecma-international.org/11.0/#sec-thisstringvalue',
+	thisSymbolValue: 'https://262.ecma-international.org/11.0/#sec-thissymbolvalue',
+	thisTimeValue: 'https://262.ecma-international.org/11.0/#sec-thistimevalue',
+	ThrowCompletion: 'https://262.ecma-international.org/11.0/#sec-throwcompletion',
+	TimeClip: 'https://262.ecma-international.org/11.0/#sec-timeclip',
+	TimeFromYear: 'https://262.ecma-international.org/11.0/#eqn-TimeFromYear',
+	TimeString: 'https://262.ecma-international.org/11.0/#sec-timestring',
+	TimeWithinDay: 'https://262.ecma-international.org/11.0/#eqn-TimeWithinDay',
+	TimeZoneString: 'https://262.ecma-international.org/11.0/#sec-timezoneestring',
+	ToBigInt: 'https://262.ecma-international.org/11.0/#sec-tobigint',
+	ToBigInt64: 'https://262.ecma-international.org/11.0/#sec-tobigint64',
+	ToBigUint64: 'https://262.ecma-international.org/11.0/#sec-tobiguint64',
+	ToBoolean: 'https://262.ecma-international.org/11.0/#sec-toboolean',
+	ToDateString: 'https://262.ecma-international.org/11.0/#sec-todatestring',
+	ToIndex: 'https://262.ecma-international.org/11.0/#sec-toindex',
+	ToInt16: 'https://262.ecma-international.org/11.0/#sec-toint16',
+	ToInt32: 'https://262.ecma-international.org/11.0/#sec-toint32',
+	ToInt8: 'https://262.ecma-international.org/11.0/#sec-toint8',
+	ToInteger: 'https://262.ecma-international.org/11.0/#sec-tointeger',
+	ToLength: 'https://262.ecma-international.org/11.0/#sec-tolength',
+	ToNumber: 'https://262.ecma-international.org/11.0/#sec-tonumber',
+	ToNumeric: 'https://262.ecma-international.org/11.0/#sec-tonumeric',
+	ToObject: 'https://262.ecma-international.org/11.0/#sec-toobject',
+	ToPrimitive: 'https://262.ecma-international.org/11.0/#sec-toprimitive',
+	ToPropertyDescriptor: 'https://262.ecma-international.org/11.0/#sec-topropertydescriptor',
+	ToPropertyKey: 'https://262.ecma-international.org/11.0/#sec-topropertykey',
+	ToString: 'https://262.ecma-international.org/11.0/#sec-tostring',
+	ToUint16: 'https://262.ecma-international.org/11.0/#sec-touint16',
+	ToUint32: 'https://262.ecma-international.org/11.0/#sec-touint32',
+	ToUint8: 'https://262.ecma-international.org/11.0/#sec-touint8',
+	ToUint8Clamp: 'https://262.ecma-international.org/11.0/#sec-touint8clamp',
+	TriggerPromiseReactions: 'https://262.ecma-international.org/11.0/#sec-triggerpromisereactions',
+	TrimString: 'https://262.ecma-international.org/11.0/#sec-trimstring',
+	Type: 'https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values',
+	TypedArrayCreate: 'https://262.ecma-international.org/11.0/#typedarray-create',
+	TypedArraySpeciesCreate: 'https://262.ecma-international.org/11.0/#typedarray-species-create',
+	UnicodeEscape: 'https://262.ecma-international.org/11.0/#sec-unicodeescape',
+	UnicodeMatchProperty: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-unicodematchproperty-p',
+	UnicodeMatchPropertyValue: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v',
+	UpdateEmpty: 'https://262.ecma-international.org/11.0/#sec-updateempty',
+	UTC: 'https://262.ecma-international.org/11.0/#sec-utc-t',
+	UTF16DecodeString: 'https://262.ecma-international.org/11.0/#sec-utf16decodestring',
+	UTF16DecodeSurrogatePair: 'https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair',
+	UTF16Encode: 'https://262.ecma-international.org/11.0/#sec-utf16encode',
+	UTF16Encoding: 'https://262.ecma-international.org/11.0/#sec-utf16encoding',
+	ValidateAndApplyPropertyDescriptor: 'https://262.ecma-international.org/11.0/#sec-validateandapplypropertydescriptor',
+	ValidateAtomicAccess: 'https://262.ecma-international.org/11.0/#sec-validateatomicaccess',
+	ValidateSharedIntegerTypedArray: 'https://262.ecma-international.org/11.0/#sec-validatesharedintegertypedarray',
+	ValidateTypedArray: 'https://262.ecma-international.org/11.0/#sec-validatetypedarray',
+	ValueOfReadEvent: 'https://262.ecma-international.org/11.0/#sec-valueofreadevent',
+	WeekDay: 'https://262.ecma-international.org/11.0/#sec-week-day',
+	WordCharacters: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
+	YearFromTime: 'https://262.ecma-international.org/11.0/#eqn-YearFromTime'
+};
diff --git a/node_modules/es-abstract/package.json b/node_modules/es-abstract/package.json
new file mode 100644
index 0000000..d1b6ec7
--- /dev/null
+++ b/node_modules/es-abstract/package.json
@@ -0,0 +1,153 @@
+{
+  "_from": "es-abstract@^1.18.0-next.2",
+  "_id": "es-abstract@1.18.0",
+  "_inBundle": false,
+  "_integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+  "_location": "/es-abstract",
+  "_phantomChildren": {
+    "function-bind": "1.1.1",
+    "has": "1.0.3"
+  },
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "es-abstract@^1.18.0-next.2",
+    "name": "es-abstract",
+    "escapedName": "es-abstract",
+    "rawSpec": "^1.18.0-next.2",
+    "saveSpec": null,
+    "fetchSpec": "^1.18.0-next.2"
+  },
+  "_requiredBy": [
+    "/object.getownpropertydescriptors",
+    "/object.values",
+    "/util.promisify"
+  ],
+  "_resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+  "_shasum": "ab80b359eecb7ede4c298000390bc5ac3ec7b5a4",
+  "_spec": "es-abstract@^1.18.0-next.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\object.values",
+  "author": {
+    "name": "Jordan Harband",
+    "email": "ljharb@gmail.com",
+    "url": "http://ljharb.codes"
+  },
+  "bugs": {
+    "url": "https://github.com/ljharb/es-abstract/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Jordan Harband",
+      "email": "ljharb@gmail.com",
+      "url": "http://ljharb.codes"
+    }
+  ],
+  "dependencies": {
+    "call-bind": "^1.0.2",
+    "es-to-primitive": "^1.2.1",
+    "function-bind": "^1.1.1",
+    "get-intrinsic": "^1.1.1",
+    "has": "^1.0.3",
+    "has-symbols": "^1.0.2",
+    "is-callable": "^1.2.3",
+    "is-negative-zero": "^2.0.1",
+    "is-regex": "^1.1.2",
+    "is-string": "^1.0.5",
+    "object-inspect": "^1.9.0",
+    "object-keys": "^1.1.1",
+    "object.assign": "^4.1.2",
+    "string.prototype.trimend": "^1.0.4",
+    "string.prototype.trimstart": "^1.0.4",
+    "unbox-primitive": "^1.0.0"
+  },
+  "deprecated": false,
+  "description": "ECMAScript spec abstract operations.",
+  "devDependencies": {
+    "@ljharb/eslint-config": "^17.5.1",
+    "array.prototype.indexof": "^1.0.2",
+    "aud": "^1.1.4",
+    "cheerio": "=1.0.0-rc.3",
+    "diff": "^5.0.0",
+    "eclint": "^2.8.1",
+    "es-value-fixtures": "^1.2.1",
+    "eslint": "^7.21.0",
+    "foreach": "^2.0.5",
+    "functions-have-names": "^1.2.2",
+    "has-bigints": "^1.0.1",
+    "has-strict-mode": "^1.0.1",
+    "in-publish": "^2.0.1",
+    "make-arrow-function": "^1.2.0",
+    "make-async-function": "^1.0.0",
+    "make-async-generator-function": "^1.0.0",
+    "make-generator-function": "^2.0.0",
+    "nyc": "^10.3.2",
+    "object.fromentries": "^2.0.4",
+    "safe-publish-latest": "^1.1.4",
+    "ses": "^0.10.4",
+    "tape": "^5.2.1"
+  },
+  "engines": {
+    "node": ">= 0.4"
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/ljharb"
+  },
+  "greenkeeper": {
+    "//": "nyc is ignored because it requires node 4+, and we support older than that",
+    "ignore": [
+      "nyc"
+    ]
+  },
+  "homepage": "https://github.com/ljharb/es-abstract#readme",
+  "keywords": [
+    "ECMAScript",
+    "ES",
+    "abstract",
+    "operation",
+    "abstract operation",
+    "JavaScript",
+    "ES5",
+    "ES6",
+    "ES7"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "es-abstract",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/ljharb/es-abstract.git"
+  },
+  "scripts": {
+    "eccheck": "eclint check *.js **/*.js > /dev/null",
+    "lint": "eslint .",
+    "postspackle": "git ls-files | xargs git check-attr spackled | grep -v 'unspecified$' | cut -d: -f1 | xargs git add",
+    "posttest": "aud --production",
+    "prepublish": "safe-publish-latest && (not-in-publish || npm run spackle)",
+    "prespackle": "git ls-files | xargs git check-attr spackled | grep -v 'unspecified$' | cut -d: -f1 | xargs rm || true",
+    "pretest": "npm run lint",
+    "spackle": "node operations/spackle 1",
+    "test": "npm run tests-only && npm run test:ses",
+    "test:ses": "node test/ses-compat",
+    "tests-only": "nyc node test"
+  },
+  "testling": {
+    "files": "test/index.js",
+    "browsers": [
+      "iexplore/6.0..latest",
+      "firefox/3.0..6.0",
+      "firefox/15.0..latest",
+      "firefox/nightly",
+      "chrome/4.0..10.0",
+      "chrome/20.0..latest",
+      "chrome/canary",
+      "opera/10.0..latest",
+      "opera/next",
+      "safari/4.0..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2"
+    ]
+  },
+  "version": "1.18.0"
+}
diff --git a/node_modules/es-abstract/test/GetIntrinsic.js b/node_modules/es-abstract/test/GetIntrinsic.js
new file mode 100644
index 0000000..2f21e76
--- /dev/null
+++ b/node_modules/es-abstract/test/GetIntrinsic.js
@@ -0,0 +1,207 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var test = require('tape');
+var forEach = require('foreach');
+var debug = require('object-inspect');
+var generatorFns = require('make-generator-function')();
+var asyncFns = require('make-async-function').list();
+var asyncGenFns = require('make-async-generator-function')();
+
+var callBound = require('call-bind/callBound');
+var v = require('es-value-fixtures');
+var $gOPD = require('../helpers/getOwnPropertyDescriptor');
+var defineProperty = require('./helpers/defineProperty');
+
+var $isProto = callBound('%Object.prototype.isPrototypeOf%');
+
+test('export', function (t) {
+	t.equal(typeof GetIntrinsic, 'function', 'it is a function');
+	t.equal(GetIntrinsic.length, 2, 'function has length of 2');
+
+	t.end();
+});
+
+test('throws', function (t) {
+	t['throws'](
+		function () { GetIntrinsic('not an intrinsic'); },
+		SyntaxError,
+		'nonexistent intrinsic throws a syntax error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic(''); },
+		TypeError,
+		'empty string intrinsic throws a type error'
+	);
+
+	t['throws'](
+		function () { GetIntrinsic('.'); },
+		SyntaxError,
+		'"just a dot" intrinsic throws a syntax error'
+	);
+
+	forEach(v.nonStrings, function (nonString) {
+		t['throws'](
+			function () { GetIntrinsic(nonString); },
+			TypeError,
+			debug(nonString) + ' is not a String'
+		);
+	});
+
+	forEach(v.nonBooleans, function (nonBoolean) {
+		t['throws'](
+			function () { GetIntrinsic('%', nonBoolean); },
+			TypeError,
+			debug(nonBoolean) + ' is not a Boolean'
+		);
+	});
+
+	forEach([
+		'toString',
+		'propertyIsEnumerable',
+		'hasOwnProperty'
+	], function (objectProtoMember) {
+		t['throws'](
+			function () { GetIntrinsic(objectProtoMember); },
+			SyntaxError,
+			debug(objectProtoMember) + ' is not an intrinsic'
+		);
+	});
+
+	t.end();
+});
+
+test('base intrinsics', function (t) {
+	t.equal(GetIntrinsic('%Object%'), Object, '%Object% yields Object');
+	t.equal(GetIntrinsic('Object'), Object, 'Object yields Object');
+	t.equal(GetIntrinsic('%Array%'), Array, '%Array% yields Array');
+	t.equal(GetIntrinsic('Array'), Array, 'Array yields Array');
+
+	t.end();
+});
+
+test('dotted paths', function (t) {
+	t.equal(GetIntrinsic('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% yields Object.prototype.toString');
+	t.equal(GetIntrinsic('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString yields Object.prototype.toString');
+	t.equal(GetIntrinsic('%Array.prototype.push%'), Array.prototype.push, '%Array.prototype.push% yields Array.prototype.push');
+	t.equal(GetIntrinsic('Array.prototype.push'), Array.prototype.push, 'Array.prototype.push yields Array.prototype.push');
+
+	test('underscore paths are aliases for dotted paths', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
+		var original = GetIntrinsic('%ObjProto_toString%');
+
+		forEach([
+			'%Object.prototype.toString%',
+			'Object.prototype.toString',
+			'%ObjectPrototype.toString%',
+			'ObjectPrototype.toString',
+			'%ObjProto_toString%',
+			'ObjProto_toString'
+		], function (name) {
+			defineProperty(Object.prototype, 'toString', {
+				value: function toString() {
+					return original.apply(this, arguments);
+				}
+			});
+			st.equal(GetIntrinsic(name), original, name + ' yields original Object.prototype.toString');
+		});
+
+		defineProperty(Object.prototype, 'toString', { value: original });
+		st.end();
+	});
+
+	test('dotted paths cache', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
+		var original = GetIntrinsic('%Object.prototype.propertyIsEnumerable%');
+
+		forEach([
+			'%Object.prototype.propertyIsEnumerable%',
+			'Object.prototype.propertyIsEnumerable',
+			'%ObjectPrototype.propertyIsEnumerable%',
+			'ObjectPrototype.propertyIsEnumerable'
+		], function (name) {
+			// eslint-disable-next-line no-extend-native
+			Object.prototype.propertyIsEnumerable = function propertyIsEnumerable() {
+				return original.apply(this, arguments);
+			};
+			st.equal(GetIntrinsic(name), original, name + ' yields cached Object.prototype.propertyIsEnumerable');
+		});
+
+		// eslint-disable-next-line no-extend-native
+		Object.prototype.propertyIsEnumerable = original;
+		st.end();
+	});
+
+	test('dotted path reports correct error', function (st) {
+		st['throws'](function () {
+			GetIntrinsic('%NonExistentIntrinsic.prototype.property%');
+		}, /%NonExistentIntrinsic%/, 'The base intrinsic of %NonExistentIntrinsic.prototype.property% is %NonExistentIntrinsic%');
+
+		st['throws'](function () {
+			GetIntrinsic('%NonExistentIntrinsicPrototype.property%');
+		}, /%NonExistentIntrinsicPrototype%/, 'The base intrinsic of %NonExistentIntrinsicPrototype.property% is %NonExistentIntrinsicPrototype%');
+
+		st.end();
+	});
+
+	t.end();
+});
+
+test('accessors', { skip: !$gOPD || typeof Map !== 'function' }, function (t) {
+	var actual = $gOPD(Map.prototype, 'size');
+	t.ok(actual, 'Map.prototype.size has a descriptor');
+	t.equal(typeof actual.get, 'function', 'Map.prototype.size has a getter function');
+	t.equal(GetIntrinsic('%Map.prototype.size%'), actual.get, '%Map.prototype.size% yields the getter for it');
+	t.equal(GetIntrinsic('Map.prototype.size'), actual.get, 'Map.prototype.size yields the getter for it');
+
+	t.end();
+});
+
+test('generator functions', { skip: !generatorFns.length }, function (t) {
+	var $GeneratorFunction = GetIntrinsic('%GeneratorFunction%');
+	var $GeneratorFunctionPrototype = GetIntrinsic('%Generator%');
+	var $GeneratorPrototype = GetIntrinsic('%GeneratorPrototype%');
+
+	forEach(generatorFns, function (genFn) {
+		var fnName = genFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'genFn';
+
+		t.ok(genFn instanceof $GeneratorFunction, fnName + ' instanceof %GeneratorFunction%');
+		t.ok($isProto($GeneratorFunctionPrototype, genFn), '%Generator% is prototype of ' + fnName);
+		t.ok($isProto($GeneratorPrototype, genFn.prototype), '%GeneratorPrototype% is prototype of ' + fnName + '.prototype');
+	});
+
+	t.end();
+});
+
+test('async functions', { skip: !asyncFns.length }, function (t) {
+	var $AsyncFunction = GetIntrinsic('%AsyncFunction%');
+	var $AsyncFunctionPrototype = GetIntrinsic('%AsyncFunctionPrototype%');
+
+	forEach(asyncFns, function (asyncFn) {
+		var fnName = asyncFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'asyncFn';
+
+		t.ok(asyncFn instanceof $AsyncFunction, fnName + ' instanceof %AsyncFunction%');
+		t.ok($isProto($AsyncFunctionPrototype, asyncFn), '%AsyncFunctionPrototype% is prototype of ' + fnName);
+	});
+
+	t.end();
+});
+
+test('async generator functions', { skip: !asyncGenFns.length }, function (t) {
+	var $AsyncGeneratorFunction = GetIntrinsic('%AsyncGeneratorFunction%');
+	var $AsyncGeneratorFunctionPrototype = GetIntrinsic('%AsyncGenerator%');
+	var $AsyncGeneratorPrototype = GetIntrinsic('%AsyncGeneratorPrototype%');
+
+	forEach(asyncGenFns, function (asyncGenFn) {
+		var fnName = asyncGenFn.name;
+		fnName = fnName ? "'" + fnName + "'" : 'asyncGenFn';
+
+		t.ok(asyncGenFn instanceof $AsyncGeneratorFunction, fnName + ' instanceof %AsyncGeneratorFunction%');
+		t.ok($isProto($AsyncGeneratorFunctionPrototype, asyncGenFn), '%AsyncGenerator% is prototype of ' + fnName);
+		t.ok($isProto($AsyncGeneratorPrototype, asyncGenFn.prototype), '%AsyncGeneratorPrototype% is prototype of ' + fnName + '.prototype');
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/diffOps.js b/node_modules/es-abstract/test/diffOps.js
new file mode 100644
index 0000000..06641b1
--- /dev/null
+++ b/node_modules/es-abstract/test/diffOps.js
@@ -0,0 +1,58 @@
+'use strict';
+
+var keys = require('object-keys');
+var forEach = require('foreach');
+var indexOf = require('array.prototype.indexof');
+var has = require('has');
+
+module.exports = function diffOperations(actual, expected, expectedMissing) {
+	var actualKeys = keys(actual);
+	var expectedKeys = keys(expected);
+
+	var extra = [];
+	var missing = [];
+	var extraMissing = [];
+
+	forEach(actualKeys, function (op) {
+		if (!(op in expected)) {
+			if (actual[op] && typeof actual[op] === 'object') {
+				forEach(keys(actual[op]), function (nestedOp) {
+					var fullNestedOp = op + '::' + nestedOp;
+					if (!(fullNestedOp in expected)) {
+						extra.push(fullNestedOp);
+					} else if (indexOf(expectedMissing, fullNestedOp) !== -1) {
+						extra.push(fullNestedOp);
+					}
+				});
+			} else {
+				extra.push(op);
+			}
+		} else if (indexOf(expectedMissing, op) !== -1) {
+			extra.push(op);
+		}
+	});
+	var checkMissing = function checkMissing(op, actualValue) {
+		if (typeof actualValue !== 'function' && indexOf(expectedMissing, op) === -1) {
+			missing.push(op);
+		}
+	};
+	forEach(expectedKeys, function (op) {
+		if (op.indexOf('::') > -1) {
+			var parts = op.split('::');
+			var value = actual[parts[0]];
+			if (value && typeof value === 'object' && typeof value[parts[1]] === 'function') {
+				checkMissing(op, value[parts[1]]);
+			}
+		} else {
+			checkMissing(op, actual[op]);
+		}
+	});
+
+	forEach(expectedMissing, function (expectedOp) {
+		if (!has(expected, expectedOp)) {
+			extraMissing.push(expectedOp);
+		}
+	});
+
+	return { missing: missing, extra: extra, extraMissing: extraMissing };
+};
diff --git a/node_modules/es-abstract/test/es2015.js b/node_modules/es-abstract/test/es2015.js
new file mode 100644
index 0000000..33a8ead
--- /dev/null
+++ b/node_modules/es-abstract/test/es2015.js
@@ -0,0 +1,144 @@
+'use strict';
+
+var ES = require('../').ES2015;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2015');
+
+var expectedMissing = [
+	'AddRestrictedFunctionProperties',
+	'AllocateArrayBuffer',
+	'AllocateTypedArray',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CharacterRange',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateIntrinsics',
+	'CreateListIterator',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateSetIterator',
+	'CreateUnmappedArgumentsObject',
+	'DaylightSavingTA',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnqueueJob',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateDirectCall',
+	'EvaluateNew',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionAllocate',
+	'FunctionCreate',
+	'FunctionInitialize',
+	'GeneratorFunctionCreate',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetBase',
+	'GetFunctionRealm',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetReferencedName',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'HasPrimitiveBase',
+	'HostResolveImportedModule',
+	'ImportedLocalNames',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsPropertyReference',
+	'IsStrictReference',
+	'IsSuperReference',
+	'IsUnresolvableReference',
+	'IsWordChar',
+	'LocalTime',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'min',
+	'ModuleNamespaceCreate',
+	'msPerDay', // constant
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NormalCompletion',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'ParseModule',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RepeatMatcher',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'sign',
+	'SortCompare', // mystery access to `comparefn` arg
+	'TriggerPromiseReactions',
+	'TypedArrayFrom',
+	'UpdateEmpty', // completion records
+	'UTC' // depends on LocalTZA, DaylightSavingTA
+];
+
+require('./tests').es2015(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2015);
diff --git a/node_modules/es-abstract/test/es2016.js b/node_modules/es-abstract/test/es2016.js
new file mode 100644
index 0000000..c813ac5
--- /dev/null
+++ b/node_modules/es-abstract/test/es2016.js
@@ -0,0 +1,165 @@
+'use strict';
+
+var ES = require('../').ES2016;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2016');
+
+var expectedMissing = [
+	'AddRestrictedFunctionProperties',
+	'AllocateArrayBuffer',
+	'AllocateTypedArray',
+	'AllocateTypedArrayBuffer',
+	'BlockDeclarationInstantiation',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CharacterRange',
+	'CharacterRangeOrUnion',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateIntrinsics',
+	'CreateListIterator',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateResolvingFunctions',
+	'CreateSetIterator',
+	'CreateStringIterator',
+	'CreateUnmappedArgumentsObject',
+	'DaylightSavingTA',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnqueueJob',
+	'EnumerateObjectProperties',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateDirectCall',
+	'EvaluateNew',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionAllocate',
+	'FunctionCreate',
+	'FunctionDeclarationInstantiation',
+	'FunctionInitialize',
+	'GeneratorFunctionCreate',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetActiveScriptOrModule',
+	'GetFunctionRealm',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'GlobalDeclarationInstantiation',
+	'HostPromiseRejectionTracker',
+	'HostReportErrors',
+	'HostResolveImportedModule',
+	'IfAbruptRejectPromise',
+	'ImportedLocalNames',
+	'InitializeBoundName',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsWordChar',
+	'LocalTime',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'min',
+	'ModuleNamespaceCreate',
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NextJob',
+	'NormalCompletion',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'OrdinaryDelete',
+	'OrdinaryGet',
+	'OrdinaryIsExtensible',
+	'OrdinaryOwnPropertyKeys',
+	'OrdinaryPreventExtensions',
+	'OrdinarySet',
+	'ParseModule',
+	'ParseScript',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'PromiseReactionJob',
+	'PromiseResolveThenableJob',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RepeatMatcher',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'ReturnIfAbrupt',
+	'ScriptEvaluation',
+	'ScriptEvaluationJob',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'SortCompare', // mystery access to `comparefn` arg
+	'TopLevelModuleEvaluationJob',
+	'ToString Applied to the Number Type',
+	'TriggerPromiseReactions',
+	'TypedArrayCreate',
+	'TypedArraySpeciesCreate',
+	'UpdateEmpty', // completion records
+	'UTC', // depends on LocalTZA, DaylightSavingTA
+	'ValidateTypedArray'
+];
+
+require('./tests').es2016(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2016);
diff --git a/node_modules/es-abstract/test/es2017.js b/node_modules/es-abstract/test/es2017.js
new file mode 100644
index 0000000..ab6ca6f
--- /dev/null
+++ b/node_modules/es-abstract/test/es2017.js
@@ -0,0 +1,211 @@
+'use strict';
+
+var ES = require('../').ES2017;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2017');
+
+var expectedMissing = [
+	'AddWaiter',
+	'agent-order',
+	'AgentCanSuspend',
+	'AgentSignifier',
+	'AllocateArrayBuffer',
+	'AllocateSharedArrayBuffer',
+	'AllocateTypedArray',
+	'AllocateTypedArrayBuffer',
+	'AsyncFunctionAwait',
+	'AsyncFunctionCreate',
+	'AsyncFunctionStart',
+	'AtomicLoad',
+	'AtomicReadModifyWrite',
+	'BlockDeclarationInstantiation',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CharacterRange',
+	'CharacterRangeOrUnion',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'ComposeWriteEventBytes',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateIntrinsics',
+	'CreateListIterator',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateResolvingFunctions',
+	'CreateSetIterator',
+	'CreateSharedByteDataBlock',
+	'CreateStringIterator',
+	'CreateUnmappedArgumentsObject',
+	'DaylightSavingTA',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnqueueJob',
+	'EnterCriticalSection',
+	'EnumerateObjectProperties',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateDirectCall',
+	'EvaluateNew',
+	'EventSet',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionAllocate',
+	'FunctionCreate',
+	'FunctionDeclarationInstantiation',
+	'FunctionInitialize',
+	'GeneratorFunctionCreate',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetActiveScriptOrModule',
+	'GetBase',
+	'GetFunctionRealm',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModifySetValueInBuffer',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetReferencedName',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'GetWaiterList',
+	'GlobalDeclarationInstantiation',
+	'happens-before',
+	'HasPrimitiveBase',
+	'host-synchronizes-with',
+	'HostEnsureCanCompileStrings',
+	'HostEventSet',
+	'HostPromiseRejectionTracker',
+	'HostReportErrors',
+	'HostResolveImportedModule',
+	'IfAbruptRejectPromise',
+	'ImportedLocalNames',
+	'InitializeBoundName',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsPropertyReference',
+	'IsSharedArrayBuffer',
+	'IsStrictReference',
+	'IsSuperReference',
+	'IsUnresolvableReference',
+	'IsWordChar',
+	'LeaveCriticalSection',
+	'LocalTime',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'memory-order',
+	'min',
+	'ModuleNamespaceCreate',
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NormalCompletion',
+	'NumberToRawBytes',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'OrdinaryDelete',
+	'OrdinaryGet',
+	'OrdinaryIsExtensible',
+	'OrdinaryOwnPropertyKeys',
+	'OrdinaryPreventExtensions',
+	'OrdinarySet',
+	'OrdinaryToPrimitive',
+	'ParseModule',
+	'ParseScript',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'PromiseReactionJob',
+	'PromiseResolveThenableJob',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RawBytesToNumber',
+	'reads-bytes-from',
+	'reads-from',
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RemoveWaiter',
+	'RemoveWaiters',
+	'RepeatMatcher',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'ReturnIfAbrupt',
+	'RunJobs',
+	'ScriptEvaluation',
+	'ScriptEvaluationJob',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetImmutablePrototype',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'SharedDataBlockEventSet',
+	'SortCompare', // mystery access to `comparefn` arg
+	'Suspend',
+	'TopLevelModuleEvaluationJob',
+	'ToString Applied to the Number Type',
+	'TriggerPromiseReactions',
+	'TypedArrayCreate',
+	'TypedArraySpeciesCreate',
+	'UpdateEmpty', // completion records
+	'UTC', // depends on LocalTZA, DaylightSavingTA
+	'ValidateAtomicAccess',
+	'ValidateSharedIntegerTypedArray',
+	'ValidateTypedArray',
+	'ValueOfReadEvent',
+	'WakeWaiter',
+	'WordCharacters', // depends on Canonicalize
+	'AddRestrictedFunctionProperties',
+	'synchronizes-with'
+];
+
+require('./tests').es2017(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2017);
diff --git a/node_modules/es-abstract/test/es2018.js b/node_modules/es-abstract/test/es2018.js
new file mode 100644
index 0000000..112e958
--- /dev/null
+++ b/node_modules/es-abstract/test/es2018.js
@@ -0,0 +1,229 @@
+'use strict';
+
+var ES = require('../').ES2018;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2018');
+
+var expectedMissing = [
+	'AddRestrictedFunctionProperties',
+	'AddWaiter',
+	'agent-order',
+	'AgentCanSuspend',
+	'AgentSignifier',
+	'AllocateArrayBuffer',
+	'AllocateSharedArrayBuffer',
+	'AllocateTypedArray',
+	'AllocateTypedArrayBuffer',
+	'AsyncFunctionCreate',
+	'AsyncFunctionStart',
+	'AsyncGeneratorEnqueue',
+	'AsyncGeneratorFunctionCreate',
+	'AsyncGeneratorReject',
+	'AsyncGeneratorResolve',
+	'AsyncGeneratorResumeNext',
+	'AsyncGeneratorStart',
+	'AsyncGeneratorYield',
+	'AsyncIteratorClose',
+	'AtomicLoad',
+	'AtomicReadModifyWrite',
+	'Await',
+	'BackreferenceMatcher',
+	'BlockDeclarationInstantiation',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CaseClauseIsSelected',
+	'CharacterRange',
+	'CharacterRangeOrUnion',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'ComposeWriteEventBytes',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateAsyncFromSyncIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateIntrinsics',
+	'CreateListIteratorRecord',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateResolvingFunctions',
+	'CreateSetIterator',
+	'CreateSharedByteDataBlock',
+	'CreateStringIterator',
+	'CreateUnmappedArgumentsObject',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnqueueJob',
+	'EnterCriticalSection',
+	'EnumerateObjectProperties',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateNew',
+	'EventSet',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionAllocate',
+	'FunctionCreate',
+	'FunctionDeclarationInstantiation',
+	'FunctionInitialize',
+	'GeneratorFunctionCreate',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetActiveScriptOrModule',
+	'GetBase',
+	'GetFunctionRealm',
+	'GetGeneratorKind',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModifySetValueInBuffer',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetReferencedName',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'GetWaiterList',
+	'GlobalDeclarationInstantiation',
+	'happens-before',
+	'HasPrimitiveBase',
+	'host-synchronizes-with',
+	'HostEnsureCanCompileStrings',
+	'HostEventSet',
+	'HostPromiseRejectionTracker',
+	'HostReportErrors',
+	'HostResolveImportedModule',
+	'IfAbruptRejectPromise',
+	'ImportedLocalNames',
+	'InitializeBoundName',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'InnerModuleEvaluation',
+	'InnerModuleInstantiation',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsPropertyReference',
+	'IsSharedArrayBuffer',
+	'IsStrictReference',
+	'IsSuperReference',
+	'IsUnresolvableReference',
+	'IsWordChar',
+	'LeaveCriticalSection',
+	'LocalTime',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'memory-order',
+	'min',
+	'ModuleDeclarationEnvironmentSetup',
+	'ModuleExecution',
+	'ModuleNamespaceCreate',
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NormalCompletion',
+	'NumberToRawBytes',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'OrdinaryDelete',
+	'OrdinaryGet',
+	'OrdinaryIsExtensible',
+	'OrdinaryOwnPropertyKeys',
+	'OrdinaryPreventExtensions',
+	'OrdinarySet',
+	'OrdinarySetWithOwnDescriptor',
+	'OrdinaryToPrimitive',
+	'ParseModule',
+	'ParseScript',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'PromiseReactionJob',
+	'PromiseResolveThenableJob',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RawBytesToNumber',
+	'reads-bytes-from',
+	'reads-from',
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RemoveWaiter',
+	'RemoveWaiters',
+	'RepeatMatcher',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'ReturnIfAbrupt',
+	'RunJobs',
+	'ScriptEvaluation',
+	'ScriptEvaluationJob',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetImmutablePrototype',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'SharedDataBlockEventSet',
+	'SortCompare', // mystery access to `comparefn` arg
+	'Suspend',
+	'synchronizes-with',
+	'ThrowCompletion',
+	'TimeZoneString',
+	'TopLevelModuleEvaluationJob',
+	'TriggerPromiseReactions',
+	'TypedArrayCreate',
+	'TypedArraySpeciesCreate',
+	'UnicodeMatchProperty',
+	'UnicodeMatchPropertyValue',
+	'UpdateEmpty', // completion records
+	'UTC', // depends on LocalTZA
+	'ValidateAtomicAccess',
+	'ValidateSharedIntegerTypedArray',
+	'ValidateTypedArray',
+	'ValueOfReadEvent',
+	'WakeWaiter',
+	'WordCharacters' // depends on Canonicalize
+];
+
+require('./tests').es2018(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2018);
diff --git a/node_modules/es-abstract/test/es2019.js b/node_modules/es-abstract/test/es2019.js
new file mode 100644
index 0000000..a7cc84a
--- /dev/null
+++ b/node_modules/es-abstract/test/es2019.js
@@ -0,0 +1,231 @@
+'use strict';
+
+var ES = require('../').ES2019;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2019');
+
+var expectedMissing = [
+	'AddRestrictedFunctionProperties',
+	'AddWaiter',
+	'agent-order',
+	'AgentCanSuspend',
+	'AgentSignifier',
+	'AllocateArrayBuffer',
+	'AllocateSharedArrayBuffer',
+	'AllocateTypedArray',
+	'AllocateTypedArrayBuffer',
+	'AsyncFromSyncIteratorContinuation',
+	'AsyncFunctionCreate',
+	'AsyncFunctionStart',
+	'AsyncGeneratorEnqueue',
+	'AsyncGeneratorFunctionCreate',
+	'AsyncGeneratorReject',
+	'AsyncGeneratorResolve',
+	'AsyncGeneratorResumeNext',
+	'AsyncGeneratorStart',
+	'AsyncGeneratorYield',
+	'AsyncIteratorClose',
+	'AtomicLoad',
+	'AtomicReadModifyWrite',
+	'Await',
+	'BackreferenceMatcher',
+	'BlockDeclarationInstantiation',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CaseClauseIsSelected',
+	'CharacterRange',
+	'CharacterRangeOrUnion',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'ComposeWriteEventBytes',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateAsyncFromSyncIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateIntrinsics',
+	'CreateListIteratorRecord',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateResolvingFunctions',
+	'CreateSetIterator',
+	'CreateSharedByteDataBlock',
+	'CreateStringIterator',
+	'CreateUnmappedArgumentsObject',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnqueueJob',
+	'EnterCriticalSection',
+	'EnumerateObjectProperties',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateNew',
+	'EventSet',
+	'ExecuteModule',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionAllocate',
+	'FunctionCreate',
+	'FunctionDeclarationInstantiation',
+	'FunctionInitialize',
+	'GeneratorFunctionCreate',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetActiveScriptOrModule',
+	'GetBase',
+	'GetFunctionRealm',
+	'GetGeneratorKind',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModifySetValueInBuffer',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetReferencedName',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'GetWaiterList',
+	'GlobalDeclarationInstantiation',
+	'happens-before',
+	'HasPrimitiveBase',
+	'host-synchronizes-with',
+	'HostEnsureCanCompileStrings',
+	'HostEventSet',
+	'HostPromiseRejectionTracker',
+	'HostReportErrors',
+	'HostResolveImportedModule',
+	'IfAbruptRejectPromise',
+	'ImportedLocalNames',
+	'InitializeBoundName',
+	'InitializeEnvironment',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'InnerModuleEvaluation',
+	'InnerModuleInstantiation',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsPropertyReference',
+	'IsSharedArrayBuffer',
+	'IsStrictReference',
+	'IsSuperReference',
+	'IsUnresolvableReference',
+	'IsWordChar',
+	'LeaveCriticalSection',
+	'LocalTime',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'memory-order',
+	'min',
+	'ModuleNamespaceCreate',
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NormalCompletion',
+	'NotifyWaiter',
+	'NumberToRawBytes',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'OrdinaryDelete',
+	'OrdinaryGet',
+	'OrdinaryIsExtensible',
+	'OrdinaryOwnPropertyKeys',
+	'OrdinaryPreventExtensions',
+	'OrdinarySet',
+	'OrdinarySetWithOwnDescriptor',
+	'OrdinaryToPrimitive',
+	'ParseModule',
+	'ParseScript',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'PromiseReactionJob',
+	'PromiseResolveThenableJob',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RawBytesToNumber',
+	'reads-bytes-from',
+	'reads-from',
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RemoveWaiter',
+	'RemoveWaiters',
+	'RepeatMatcher',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'ReturnIfAbrupt',
+	'RunJobs',
+	'ScriptEvaluation',
+	'ScriptEvaluationJob',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetImmutablePrototype',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'SharedDataBlockEventSet',
+	'SortCompare', // mystery access to `comparefn` arg
+	'Suspend',
+	'SynchronizeEventSet',
+	'synchronizes-with',
+	'ThrowCompletion',
+	'TimeZoneString',
+	'TopLevelModuleEvaluationJob',
+	'TriggerPromiseReactions',
+	'TypedArrayCreate',
+	'TypedArraySpeciesCreate',
+	'UnicodeMatchProperty',
+	'UnicodeMatchPropertyValue',
+	'UpdateEmpty', // completion records
+	'UTC', // depends on LocalTZA
+	'ValidateAtomicAccess',
+	'ValidateSharedIntegerTypedArray',
+	'ValidateTypedArray',
+	'ValueOfReadEvent',
+	'WordCharacters' // depends on Canonicalize
+];
+
+require('./tests').es2019(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2019);
diff --git a/node_modules/es-abstract/test/es2020.js b/node_modules/es-abstract/test/es2020.js
new file mode 100644
index 0000000..83f0b3a
--- /dev/null
+++ b/node_modules/es-abstract/test/es2020.js
@@ -0,0 +1,240 @@
+'use strict';
+
+var ES = require('../').ES2020;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/2020');
+
+var expectedMissing = [
+	'AddRestrictedFunctionProperties',
+	'AddWaiter',
+	'agent-order',
+	'AgentCanSuspend',
+	'AgentSignifier',
+	'AllocateArrayBuffer',
+	'AllocateSharedArrayBuffer',
+	'AllocateTypedArray',
+	'AllocateTypedArrayBuffer',
+	'AsyncFromSyncIteratorContinuation',
+	'AsyncFunctionStart',
+	'AsyncGeneratorEnqueue',
+	'AsyncGeneratorReject',
+	'AsyncGeneratorResolve',
+	'AsyncGeneratorResumeNext',
+	'AsyncGeneratorStart',
+	'AsyncGeneratorYield',
+	'AsyncIteratorClose',
+	'AtomicLoad',
+	'AtomicReadModifyWrite',
+	'Await',
+	'BackreferenceMatcher',
+	'BlockDeclarationInstantiation',
+	'BoundFunctionCreate',
+	'Canonicalize',
+	'CaseClauseIsSelected',
+	'CharacterRange',
+	'CharacterRangeOrUnion',
+	'CharacterSetMatcher',
+	'CloneArrayBuffer',
+	'Completion',
+	'ComposeWriteEventBytes',
+	'Construct',
+	'CopyDataBlockBytes',
+	'CreateArrayFromList',
+	'CreateArrayIterator',
+	'CreateAsyncFromSyncIterator',
+	'CreateBuiltinFunction',
+	'CreateByteDataBlock',
+	'CreateDynamicFunction',
+	'CreateForInIterator',
+	'CreateIntrinsics',
+	'CreateListIteratorRecord',
+	'CreateMapIterator',
+	'CreateMappedArgumentsObject',
+	'CreatePerIterationEnvironment',
+	'CreateRealm',
+	'CreateRegExpStringIterator',
+	'CreateResolvingFunctions',
+	'CreateSetIterator',
+	'CreateSharedByteDataBlock',
+	'CreateStringIterator',
+	'CreateUnmappedArgumentsObject',
+	'Decode',
+	'DetachArrayBuffer',
+	'Encode',
+	'EnterCriticalSection',
+	'EnumerateObjectProperties',
+	'EscapeRegExpPattern',
+	'EvalDeclarationInstantiation',
+	'EvaluateCall',
+	'EvaluateNew',
+	'EvaluatePropertyAccessWithExpressionKey',
+	'EvaluatePropertyAccessWithIdentifierKey',
+	'EventSet',
+	'ExecuteModule',
+	'FinishDynamicImport',
+	'ForBodyEvaluation',
+	'ForIn/OfBodyEvaluation',
+	'ForIn/OfHeadEvaluation',
+	'FulfillPromise',
+	'FunctionDeclarationInstantiation',
+	'GeneratorResume',
+	'GeneratorResumeAbrupt',
+	'GeneratorStart',
+	'GeneratorValidate',
+	'GeneratorYield',
+	'GetActiveScriptOrModule',
+	'GetBase',
+	'GetFunctionRealm',
+	'GetGeneratorKind',
+	'GetGlobalObject',
+	'GetIdentifierReference',
+	'GetModifySetValueInBuffer',
+	'GetModuleNamespace',
+	'GetNewTarget',
+	'GetReferencedName',
+	'GetSuperConstructor',
+	'GetTemplateObject',
+	'GetThisEnvironment',
+	'GetThisValue',
+	'GetValue',
+	'GetValueFromBuffer',
+	'GetViewValue',
+	'GetWaiterList',
+	'GlobalDeclarationInstantiation',
+	'happens-before',
+	'HasPrimitiveBase',
+	'host-synchronizes-with',
+	'HostEnqueuePromiseJob',
+	'HostEnsureCanCompileStrings',
+	'HostEventSet',
+	'HostFinalizeImportMeta',
+	'HostGetImportMetaProperties',
+	'HostImportModuleDynamically',
+	'HostPromiseRejectionTracker',
+	'HostResolveImportedModule',
+	'IfAbruptRejectPromise',
+	'ImportedLocalNames',
+	'InitializeBoundName',
+	'InitializeEnvironment',
+	'InitializeHostDefinedRealm',
+	'InitializeReferencedBinding',
+	'InnerModuleEvaluation',
+	'InnerModuleLinking',
+	'IntegerIndexedElementGet',
+	'IntegerIndexedElementSet',
+	'IntegerIndexedObjectCreate',
+	'InternalizeJSONProperty',
+	'IsAnonymousFunctionDefinition',
+	'IsCompatiblePropertyDescriptor',
+	'IsDetachedBuffer',
+	'IsInTailPosition',
+	'IsLabelledFunction',
+	'IsPropertyReference',
+	'IsSharedArrayBuffer',
+	'IsStrictReference',
+	'IsSuperReference',
+	'IsUnresolvableReference',
+	'IsValidIntegerIndex',
+	'IsValidRegularExpressionLiteral',
+	'IsWordChar',
+	'LeaveCriticalSection',
+	'LocalTime',
+	'LocalTZA',
+	'LoopContinues',
+	'MakeArgGetter',
+	'MakeArgSetter',
+	'MakeBasicObject',
+	'MakeClassConstructor',
+	'MakeConstructor',
+	'MakeMethod',
+	'MakeSuperPropertyReference',
+	'max',
+	'memory-order',
+	'min',
+	'ModuleNamespaceCreate',
+	'NewDeclarativeEnvironment',
+	'NewFunctionEnvironment',
+	'NewGlobalEnvironment',
+	'NewModuleEnvironment',
+	'NewObjectEnvironment',
+	'NewPromiseCapability',
+	'NewPromiseReactionJob',
+	'NewPromiseResolveThenableJob',
+	'NormalCompletion',
+	'NotifyWaiter',
+	'NumericToRawBytes',
+	'ObjectDefineProperties',
+	'OrdinaryCallBindThis',
+	'OrdinaryCallEvaluateBody',
+	'OrdinaryDelete',
+	'OrdinaryFunctionCreate',
+	'OrdinaryGet',
+	'OrdinaryIsExtensible',
+	'OrdinaryOwnPropertyKeys',
+	'OrdinaryPreventExtensions',
+	'OrdinarySet',
+	'OrdinarySetWithOwnDescriptor',
+	'OrdinaryToPrimitive',
+	'ParseModule',
+	'ParseScript',
+	'PerformEval',
+	'PerformPromiseAll',
+	'PerformPromiseAllSettled',
+	'PerformPromiseRace',
+	'PerformPromiseThen',
+	'PrepareForOrdinaryCall',
+	'PrepareForTailCall',
+	'ProxyCreate',
+	'PutValue', // takes a Reference
+	'RawBytesToNumeric',
+	'reads-bytes-from',
+	'reads-from',
+	'RegExpAlloc', // creates a regex with uninitialized internal lots
+	'RegExpBuiltinExec',
+	'RegExpInitialize', // initializes allocated regex's internal slots
+	'RejectPromise',
+	'RemoveWaiter',
+	'RemoveWaiters',
+	'RepeatMatcher',
+	'RequireInternalSlot',
+	'ResolveBinding',
+	'ResolveThisBinding',
+	'ReturnIfAbrupt',
+	'ScriptEvaluation',
+	'SerializeJSONArray',
+	'SerializeJSONObject',
+	'SerializeJSONProperty',
+	'SetDefaultGlobalBindings',
+	'SetImmutablePrototype',
+	'SetRealmGlobalObject',
+	'SetValueInBuffer',
+	'SetViewValue',
+	'SharedDataBlockEventSet',
+	'SortCompare', // mystery access to `comparefn` arg
+	'StringToBigInt',
+	'Suspend',
+	'synchronizes-with',
+	'ThrowCompletion',
+	'TimeZoneString',
+	'ToBigInt',
+	'ToBigInt64',
+	'ToBigUint64',
+	'TriggerPromiseReactions',
+	'TypedArrayCreate',
+	'TypedArraySpeciesCreate',
+	'UnicodeMatchProperty',
+	'UnicodeMatchPropertyValue',
+	'UpdateEmpty', // completion records
+	'UTC', // depends on LocalTZA
+	'UTF16Encode',
+	'ValidateAtomicAccess',
+	'ValidateSharedIntegerTypedArray',
+	'ValidateTypedArray',
+	'ValueOfReadEvent',
+	'WordCharacters' // depends on Canonicalize
+];
+
+require('./tests').es2020(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 2020);
diff --git a/node_modules/es-abstract/test/es5.js b/node_modules/es-abstract/test/es5.js
new file mode 100644
index 0000000..c4033f6
--- /dev/null
+++ b/node_modules/es-abstract/test/es5.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var ES = require('../').ES5;
+var boundES = require('./helpers/createBoundESNamespace')(ES);
+
+var ops = require('../operations/es5');
+
+var expectedMissing = [
+	'SplitMatch'
+];
+
+require('./tests').es5(boundES, ops, expectedMissing);
+
+require('./helpers/runManifestTest')(require('tape'), ES, 5);
diff --git a/node_modules/es-abstract/test/es6.js b/node_modules/es-abstract/test/es6.js
new file mode 100644
index 0000000..e7c9d98
--- /dev/null
+++ b/node_modules/es-abstract/test/es6.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var test = require('tape');
+
+var ES = require('../');
+var ES6 = ES.ES6;
+var ES2015 = ES.ES2015;
+var ES6entry = require('../es6');
+
+test('legacy es6 export', function (t) {
+	t.equal(ES6, ES2015, 'main ES6 === main ES2015');
+	t.end();
+});
+
+test('legacy es6 entry point', function (t) {
+	t.equal(ES6, ES6entry, 'main ES6 === ES6 entry point');
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/es7.js b/node_modules/es-abstract/test/es7.js
new file mode 100644
index 0000000..ee57e15
--- /dev/null
+++ b/node_modules/es-abstract/test/es7.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var test = require('tape');
+
+var ES = require('../');
+var ES7 = ES.ES7;
+var ES2016 = ES.ES2016;
+var ES7entry = require('../es7');
+
+test('legacy es7 export', function (t) {
+	t.equal(ES7, ES2016, 'main ES7 === main ES2016');
+	t.end();
+});
+
+test('legacy es7 entry point', function (t) {
+	t.equal(ES7, ES7entry, 'main ES7 === ES7 entry point');
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/OwnPropertyKeys.js b/node_modules/es-abstract/test/helpers/OwnPropertyKeys.js
new file mode 100644
index 0000000..9c2b4fc
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/OwnPropertyKeys.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var test = require('tape');
+var hasSymbols = require('has-symbols')();
+
+var OwnPropertyKeys = require('../../helpers/OwnPropertyKeys');
+var defineProperty = require('./defineProperty');
+
+test('OwnPropertyKeys', function (t) {
+	t.deepEqual(OwnPropertyKeys({ a: 1, b: 2 }).sort(), ['a', 'b'].sort(), 'returns own string keys');
+
+	t.test('Symbols', { skip: !hasSymbols }, function (st) {
+		var o = { a: 1 };
+		var sym = Symbol();
+		o[sym] = 2;
+
+		st.deepEqual(OwnPropertyKeys(o), ['a', sym], 'returns own string and symbol keys');
+
+		st.end();
+	});
+
+	t.test('non-enumerables', { skip: !defineProperty.oDP }, function (st) {
+		var o = { a: 1, b: 42, c: NaN };
+		defineProperty(o, 'b', { enumerable: false, value: 42 });
+		defineProperty(o, 'c', { enumerable: false, get: function () { return NaN; } });
+
+		if (hasSymbols) {
+			defineProperty(o, 'd', { enumerable: false, value: true });
+			defineProperty(o, 'e', { enumerable: false, get: function () { return true; } });
+		}
+
+		st.deepEqual(
+			OwnPropertyKeys(o).sort(),
+			(hasSymbols ? ['a', 'b', 'c', 'd', 'e'] : ['a', 'b', 'c']).sort(),
+			'returns non-enumerable own keys, including accessors and symbols if available'
+		);
+
+		st.end();
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/assertRecord.js b/node_modules/es-abstract/test/helpers/assertRecord.js
new file mode 100644
index 0000000..0231101
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/assertRecord.js
@@ -0,0 +1,60 @@
+'use strict';
+
+var forEach = require('foreach');
+var debug = require('object-inspect');
+
+var assertRecord = require('../../helpers/assertRecord');
+var v = require('es-value-fixtures');
+
+module.exports = function assertRecordTests(ES, test) {
+	test('Property Descriptor', function (t) {
+		var record = 'Property Descriptor';
+
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { assertRecord(ES.Type, record, 'arg', primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t['throws'](
+			function () { assertRecord(ES.Type, record, 'arg', { invalid: true }); },
+			TypeError,
+			'invalid keys not allowed on a Property Descriptor'
+		);
+
+		t.doesNotThrow(
+			function () { assertRecord(ES.Type, record, 'arg', {}); },
+			'empty object is an incomplete Property Descriptor'
+		);
+
+		t.doesNotThrow(
+			function () { assertRecord(ES.Type, record, 'arg', v.accessorDescriptor()); },
+			'accessor descriptor is a Property Descriptor'
+		);
+
+		t.doesNotThrow(
+			function () { assertRecord(ES.Type, record, 'arg', v.mutatorDescriptor()); },
+			'mutator descriptor is a Property Descriptor'
+		);
+
+		t.doesNotThrow(
+			function () { assertRecord(ES.Type, record, 'arg', v.dataDescriptor()); },
+			'data descriptor is a Property Descriptor'
+		);
+
+		t.doesNotThrow(
+			function () { assertRecord(ES.Type, record, 'arg', v.genericDescriptor()); },
+			'generic descriptor is a Property Descriptor'
+		);
+
+		t['throws'](
+			function () { assertRecord(ES.Type, record, 'arg', v.bothDescriptor()); },
+			TypeError,
+			'a Property Descriptor can not be both a Data and an Accessor Descriptor'
+		);
+
+		t.end();
+	});
+};
diff --git a/node_modules/es-abstract/test/helpers/createBoundESNamespace.js b/node_modules/es-abstract/test/helpers/createBoundESNamespace.js
new file mode 100644
index 0000000..0150404
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/createBoundESNamespace.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var bind = require('function-bind');
+
+var OwnPropertyKeys = require('../../helpers/OwnPropertyKeys');
+
+module.exports = function createBoundESNamespace(ES) {
+	var keys = OwnPropertyKeys(ES);
+	var result = {};
+
+	for (var i = 0; i < keys.length; i++) {
+		var key = keys[i];
+		var prop = ES[key];
+		if (typeof prop === 'function') {
+			prop = bind.call(prop, undefined);
+		} else if (prop && typeof prop === 'object') {
+			prop = createBoundESNamespace(prop);
+		}
+		result[key] = prop;
+	}
+
+	return result;
+};
diff --git a/node_modules/es-abstract/test/helpers/defineProperty.js b/node_modules/es-abstract/test/helpers/defineProperty.js
new file mode 100644
index 0000000..03102a8
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/defineProperty.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var GetIntrinsic = require('../../GetIntrinsic');
+
+var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
+
+if ($defineProperty) {
+	try {
+		$defineProperty({}, 'a', { value: 1 });
+	} catch (e) {
+		// IE 8 has a broken defineProperty
+		$defineProperty = null;
+	}
+}
+
+module.exports = function defineProperty(O, P, Desc) {
+	if ($defineProperty) {
+		return $defineProperty(O, P, Desc);
+	}
+	if ((Desc.enumerable && Desc.configurable && Desc.writable) || !(P in O)) {
+		O[P] = Desc.value; // eslint-disable-line no-param-reassign
+		return O;
+	}
+
+	throw new SyntaxError('helper does not yet support this configuration');
+};
+module.exports.oDP = $defineProperty;
diff --git a/node_modules/es-abstract/test/helpers/getSymbolDescription.js b/node_modules/es-abstract/test/helpers/getSymbolDescription.js
new file mode 100644
index 0000000..05be3bb
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/getSymbolDescription.js
@@ -0,0 +1,67 @@
+'use strict';
+
+var test = require('tape');
+var debug = require('object-inspect');
+var forEach = require('foreach');
+var has = require('has');
+
+var v = require('es-value-fixtures');
+var getSymbolDescription = require('../../helpers/getSymbolDescription');
+var getInferredName = require('../../helpers/getInferredName');
+
+test('getSymbolDescription', function (t) {
+	t.test('no symbols', { skip: v.hasSymbols }, function (st) {
+		st['throws'](
+			getSymbolDescription,
+			SyntaxError,
+			'requires Symbol support'
+		);
+
+		st.end();
+	});
+
+	forEach(v.nonSymbolPrimitives.concat(v.objects), function (nonSymbol) {
+		t['throws'](
+			function () { getSymbolDescription(nonSymbol); },
+			v.hasSymbols ? TypeError : SyntaxError,
+			debug(nonSymbol) + ' is not a Symbol'
+		);
+	});
+
+	t.test('with symbols', { skip: !v.hasSymbols }, function (st) {
+		forEach(
+			[
+				[Symbol(), undefined],
+				[Symbol(undefined), undefined],
+				[Symbol(null), 'null'],
+				[Symbol.iterator, 'Symbol.iterator'],
+				[Symbol('foo'), 'foo']
+			],
+			function (pair) {
+				var sym = pair[0];
+				var desc = pair[1];
+				st.equal(getSymbolDescription(sym), desc, debug(sym) + ' description is ' + debug(desc));
+			}
+		);
+
+		st.test('only possible when inference or native `Symbol.prototype.description` is supported', {
+			skip: !getInferredName && !has(Symbol.prototype, 'description')
+		}, function (s2t) {
+			s2t.equal(getSymbolDescription(Symbol('')), '', 'Symbol("") description is ""');
+
+			s2t.end();
+		});
+
+		st.test('only possible when global symbols are supported', {
+			skip: !has(Symbol, 'for') || !has(Symbol, 'keyFor')
+		}, function (s2t) {
+			// eslint-disable-next-line no-restricted-properties
+			s2t.equal(getSymbolDescription(Symbol['for']('')), '', 'Symbol.for("") description is ""');
+			s2t.end();
+		});
+
+		st.end();
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/index.js b/node_modules/es-abstract/test/helpers/index.js
new file mode 100644
index 0000000..4260bc2
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/index.js
@@ -0,0 +1,6 @@
+'use strict';
+
+require('./getSymbolDescription');
+require('./isByteValue');
+require('./isCodePoint');
+require('./OwnPropertyKeys');
diff --git a/node_modules/es-abstract/test/helpers/isByteValue.js b/node_modules/es-abstract/test/helpers/isByteValue.js
new file mode 100644
index 0000000..f894910
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/isByteValue.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var test = require('tape');
+var forEach = require('foreach');
+var debug = require('object-inspect');
+
+var isByteValue = require('../../helpers/isByteValue');
+var v = require('es-value-fixtures');
+
+test('isByteValue', function (t) {
+	forEach([].concat(
+		v.notNonNegativeIntegers,
+		-1,
+		-42,
+		-Infinity,
+		Infinity,
+		v.nonIntegerNumbers
+	), function (nonByteValue) {
+		t.equal(isByteValue(nonByteValue), false, debug(nonByteValue) + ' is not a byte value');
+	});
+
+	for (var i = 0; i <= 255; i += 1) {
+		t.equal(isByteValue(i), true, i + ' is a byte value');
+	}
+	t.equal(isByteValue(256), false, '256 is not a byte value');
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/isCodePoint.js b/node_modules/es-abstract/test/helpers/isCodePoint.js
new file mode 100644
index 0000000..9106615
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/isCodePoint.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var test = require('tape');
+var forEach = require('foreach');
+var debug = require('object-inspect');
+
+var isCodePoint = require('../../helpers/isCodePoint');
+var v = require('es-value-fixtures');
+
+test('isCodePoint', function (t) {
+	forEach(v.notNonNegativeIntegers.concat(0x10FFFF + 1), function (nonCodePoints) {
+		t.equal(isCodePoint(nonCodePoints), false, debug(nonCodePoints) + ' is not a Code Point');
+	});
+
+	forEach([-0, 0, 1, 7, 42, 0x10FFFF], function (codePoint) {
+		t.equal(isCodePoint(codePoint), true, debug(codePoint) + ' is a Code Point');
+	});
+
+	t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/runManifestTest.js b/node_modules/es-abstract/test/helpers/runManifestTest.js
new file mode 100644
index 0000000..2fdb4f2
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/runManifestTest.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var path = require('path');
+var fs = require('fs');
+
+var forEach = require('foreach');
+var keys = require('object-keys');
+
+module.exports = function runManifestTest(test, ES, edition) {
+	test('ES' + edition + ' manifest', { skip: !fs.readdirSync }, function (t) {
+		var files = fs.readdirSync(path.join(__dirname, '../../' + edition), 'utf-8');
+		var map = {
+			AbstractEqualityComparison: 'Abstract Equality Comparison',
+			AbstractRelationalComparison: 'Abstract Relational Comparison',
+			StrictEqualityComparison: 'Strict Equality Comparison'
+		};
+		forEach(files, function (file) {
+			var name = path.basename(file, path.extname(file));
+			var actual = ES[map[name] || name];
+			var expected = require(path.join(__dirname, '../../' + edition + '/', file)); // eslint-disable-line global-require
+			t.equal(actual, expected, 'ES["' + name + '"] === ' + file);
+		});
+		var actualCount = keys(ES).length;
+		t.equal(actualCount, files.length, 'expected ' + files.length + ' files, got ' + actualCount);
+		t.end();
+	});
+};
diff --git a/node_modules/es-abstract/test/index.js b/node_modules/es-abstract/test/index.js
new file mode 100644
index 0000000..5ebe3db
--- /dev/null
+++ b/node_modules/es-abstract/test/index.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var ES = require('../');
+var test = require('tape');
+var keys = require('object-keys');
+var forEach = require('foreach');
+
+var ESkeys = keys(ES).sort();
+var ES6keys = keys(ES.ES6).sort();
+
+test('exposed properties', function (t) {
+	t.deepEqual(ESkeys, ES6keys.concat(['ES2020', 'ES2019', 'ES2018', 'ES2017', 'ES7', 'ES2016', 'ES6', 'ES2015', 'ES5']).sort(), 'main ES object keys match ES6 keys');
+	t.end();
+});
+
+test('methods match', function (t) {
+	forEach(ES6keys, function (key) {
+		t.equal(ES.ES6[key], ES[key], 'method ' + key + ' on main ES object is ES6 method');
+	});
+	t.end();
+});
+
+require('./GetIntrinsic');
+
+require('./helpers');
+
+require('./es5');
+require('./es6');
+require('./es2015');
+require('./es7');
+require('./es2016');
+require('./es2017');
+require('./es2018');
+require('./es2019');
+require('./es2020');
diff --git a/node_modules/es-abstract/test/ses-compat.js b/node_modules/es-abstract/test/ses-compat.js
new file mode 100644
index 0000000..c3e60f4
--- /dev/null
+++ b/node_modules/es-abstract/test/ses-compat.js
@@ -0,0 +1,8 @@
+'use strict';
+
+/* globals lockdown */
+require('ses');
+
+lockdown({ errorTaming: 'unsafe' });
+
+require('.');
diff --git a/node_modules/es-abstract/test/tests.js b/node_modules/es-abstract/test/tests.js
new file mode 100644
index 0000000..11f7cc6
--- /dev/null
+++ b/node_modules/es-abstract/test/tests.js
@@ -0,0 +1,6933 @@
+'use strict';
+
+var tape = require('tape');
+
+var forEach = require('foreach');
+var debug = require('object-inspect');
+var assign = require('object.assign');
+var keys = require('object-keys');
+var has = require('has');
+var arrowFns = require('make-arrow-function').list();
+var hasStrictMode = require('has-strict-mode')();
+var functionsHaveNames = require('functions-have-names')();
+var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();
+var hasBigInts = require('has-bigints')();
+
+var $getProto = require('../helpers/getProto');
+var $setProto = require('../helpers/setProto');
+var defineProperty = require('./helpers/defineProperty');
+var getInferredName = require('../helpers/getInferredName');
+var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
+var assertRecordTests = require('./helpers/assertRecord');
+var v = require('es-value-fixtures');
+var diffOps = require('./diffOps');
+
+var $BigInt = hasBigInts ? BigInt : null;
+
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false
+
+// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
+var noThrowOnStrictViolation = (function () {
+	try {
+		delete [].length;
+		return true;
+	} catch (e) {
+	}
+	return false;
+}());
+
+var makeTest = function makeTest(skips) {
+	return function test(opName, maybeOpts, maybeCb) {
+		var origOpts = arguments.length > 2 ? maybeOpts : {};
+		var opts = assign(
+			{},
+			origOpts,
+			{ skip: (skips && skips[opName]) || origOpts.skip }
+		);
+		var cb = arguments.length > 2 ? maybeCb : maybeOpts;
+		return tape(opName, opts, cb);
+	};
+};
+
+var leadingPoo = '\uD83D';
+var trailingPoo = '\uDCA9';
+var wholePoo = leadingPoo + trailingPoo;
+
+var getArraySubclassWithSpeciesConstructor = function getArraySubclass(speciesConstructor) {
+	var Bar = function Bar() {
+		var inst = [];
+		Object.setPrototypeOf(inst, Bar.prototype);
+		defineProperty(inst, 'constructor', { value: Bar });
+		return inst;
+	};
+	Bar.prototype = Object.create(Array.prototype);
+	Object.setPrototypeOf(Bar, Array);
+	defineProperty(Bar, Symbol.species, { value: speciesConstructor });
+
+	return Bar;
+};
+
+var testIterator = function (t, iterator, expected) {
+	var resultCount = 0;
+	var result;
+	while (result = iterator.next(), !result.done) { // eslint-disable-line no-sequences
+		t.deepEqual(result, { done: false, value: expected[resultCount] }, 'result ' + resultCount);
+		resultCount += 1;
+	}
+	t.equal(resultCount, expected.length, 'expected ' + expected.length + ', got ' + resultCount);
+};
+
+var hasSpecies = v.hasSymbols && Symbol.species;
+
+var hasLastIndex = 'lastIndex' in (/a/).exec('a'); // IE 8
+var hasGroups = 'groups' in (/a/).exec('a'); // modern engines
+var kludgeMatch = function kludgeMatch(R, matchObject) {
+	if (hasGroups) {
+		assign(matchObject, { groups: matchObject.groups });
+	}
+	if (hasLastIndex) {
+		assign(matchObject, { lastIndex: R.lastIndex });
+	}
+	return matchObject;
+};
+
+var testEnumerableOwnNames = function (t, enumerableOwnNames) {
+	forEach(v.primitives, function (nonObject) {
+		t['throws'](
+			function () { enumerableOwnNames(nonObject); },
+			debug(nonObject) + ' is not an Object'
+		);
+	});
+
+	var Child = function Child() {
+		this.own = {};
+	};
+	Child.prototype = {
+		inherited: {}
+	};
+
+	var obj = new Child();
+
+	t.equal('own' in obj, true, 'has "own"');
+	t.equal(has(obj, 'own'), true, 'has own "own"');
+	t.equal(Object.prototype.propertyIsEnumerable.call(obj, 'own'), true, 'has enumerable "own"');
+
+	t.equal('inherited' in obj, true, 'has "inherited"');
+	t.equal(has(obj, 'inherited'), false, 'has non-own "inherited"');
+	t.equal(has(Child.prototype, 'inherited'), true, 'Child.prototype has own "inherited"');
+	t.equal(Child.prototype.inherited, obj.inherited, 'Child.prototype.inherited === obj.inherited');
+	t.equal(Object.prototype.propertyIsEnumerable.call(Child.prototype, 'inherited'), true, 'has enumerable "inherited"');
+
+	t.equal('toString' in obj, true, 'has "toString"');
+	t.equal(has(obj, 'toString'), false, 'has non-own "toString"');
+	t.equal(has(Object.prototype, 'toString'), true, 'Object.prototype has own "toString"');
+	t.equal(Object.prototype.toString, obj.toString, 'Object.prototype.toString === obj.toString');
+	// eslint-disable-next-line no-useless-call
+	t.equal(Object.prototype.propertyIsEnumerable.call(Object.prototype, 'toString'), false, 'has non-enumerable "toString"');
+
+	return obj;
+};
+
+var testToNumber = function (t, ES, ToNumber) {
+	t.equal(NaN, ToNumber(undefined), 'undefined coerces to NaN');
+	t.equal(ToNumber(null), 0, 'null coerces to +0');
+	t.equal(ToNumber(false), 0, 'false coerces to +0');
+	t.equal(1, ToNumber(true), 'true coerces to 1');
+
+	t.test('numbers', function (st) {
+		st.equal(NaN, ToNumber(NaN), 'NaN returns itself');
+		forEach(v.zeroes.concat(v.infinities, 42), function (num) {
+			st.equal(num, ToNumber(num), num + ' returns itself');
+		});
+		forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+			st.equal(+numString, ToNumber(numString), '"' + numString + '" coerces to ' + Number(numString));
+		});
+		st.end();
+	});
+
+	t.test('objects', function (st) {
+		forEach(v.objects, function (object) {
+			st.equal(ToNumber(object), ToNumber(ES.ToPrimitive(object)), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+		});
+		st['throws'](function () { return ToNumber(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		st.end();
+	});
+
+	// TODO: check if this applies to ES5
+	t.test('binary literals', function (st) {
+		st.equal(ToNumber('0b10'), 2, '0b10 is 2');
+		st.equal(ToNumber({ toString: function () { return '0b11'; } }), 3, 'Object that toStrings to 0b11 is 3');
+
+		st.equal(ToNumber('0b12'), NaN, '0b12 is NaN');
+		st.equal(ToNumber({ toString: function () { return '0b112'; } }), NaN, 'Object that toStrings to 0b112 is NaN');
+		st.end();
+	});
+
+	// TODO: check if this applies to ES5
+	t.test('octal literals', function (st) {
+		st.equal(ToNumber('0o10'), 8, '0o10 is 8');
+		st.equal(ToNumber({ toString: function () { return '0o11'; } }), 9, 'Object that toStrings to 0o11 is 9');
+
+		st.equal(ToNumber('0o18'), NaN, '0o18 is NaN');
+		st.equal(ToNumber({ toString: function () { return '0o118'; } }), NaN, 'Object that toStrings to 0o118 is NaN');
+		st.end();
+	});
+
+	// TODO: check if this applies to ES5
+	t.test('signed hex numbers', function (st) {
+		st.equal(ToNumber('-0xF'), NaN, '-0xF is NaN');
+		st.equal(ToNumber(' -0xF '), NaN, 'space-padded -0xF is NaN');
+		st.equal(ToNumber('+0xF'), NaN, '+0xF is NaN');
+		st.equal(ToNumber(' +0xF '), NaN, 'space-padded +0xF is NaN');
+
+		st.end();
+	});
+
+	// TODO: check if this applies to ES5
+	t.test('trimming of whitespace and non-whitespace characters', function (st) {
+		var whitespace = ' \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000';
+		st.equal(0, ToNumber(whitespace + 0 + whitespace), 'whitespace is trimmed');
+
+		// Zero-width space (zws), next line character (nel), and non-character (bom) are not whitespace.
+		var nonWhitespaces = {
+			'\\u0085': '\u0085',
+			'\\u200b': '\u200b',
+			'\\ufffe': '\ufffe'
+		};
+
+		forEach(nonWhitespaces, function (desc, nonWS) {
+			st.equal(ToNumber(nonWS + 0 + nonWS), NaN, 'non-whitespace ' + desc + ' not trimmed');
+		});
+
+		st.end();
+	});
+
+	// TODO: skip for ES5
+	forEach(v.symbols, function (symbol) {
+		t['throws'](
+			function () { ToNumber(symbol); },
+			TypeError,
+			'Symbols can’t be converted to a Number: ' + debug(symbol)
+		);
+	});
+
+	// TODO: check if this applies to ES5
+	t.test('dates', function (st) {
+		var invalid = new Date(NaN);
+		st.equal(ToNumber(invalid), NaN, 'invalid Date coerces to NaN');
+		var now = +new Date();
+		st.equal(ToNumber(new Date(now)), now, 'Date coerces to timestamp');
+		st.end();
+	});
+};
+
+var es5 = function ES5(ES, ops, expectedMissing, skips) {
+	var test = makeTest(skips);
+
+	test('has expected operations', function (t) {
+		var diff = diffOps(ES, ops, expectedMissing);
+
+		t.deepEqual(diff.extra, [], 'no extra ops');
+
+		t.deepEqual(diff.missing, [], 'no unexpected missing ops');
+
+		t.deepEqual(diff.extraMissing, [], 'no unexpected "expected missing" ops');
+
+		t.end();
+	});
+
+	test('ToPrimitive', function (t) {
+		t.test('primitives', function (st) {
+			var testPrimitive = function (primitive) {
+				st.equal(ES.ToPrimitive(primitive), primitive, debug(primitive) + ' is returned correctly');
+			};
+			forEach(v.primitives, testPrimitive);
+			st.end();
+		});
+
+		t.test('objects', function (st) {
+			st.equal(ES.ToPrimitive(v.coercibleObject), 3, 'coercibleObject with no hint coerces to valueOf');
+			st.equal(ES.ToPrimitive({}), '[object Object]', '{} with no hint coerces to Object#toString');
+			st.equal(ES.ToPrimitive(v.coercibleObject, Number), 3, 'coercibleObject with hint Number coerces to valueOf');
+			st.equal(ES.ToPrimitive({}, Number), '[object Object]', '{} with hint Number coerces to NaN');
+			st.equal(ES.ToPrimitive(v.coercibleObject, String), 42, 'coercibleObject with hint String coerces to nonstringified toString');
+			st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+			st.equal(ES.ToPrimitive(v.coercibleFnObject), v.coercibleFnObject.toString(), 'coercibleFnObject coerces to toString');
+			st.equal(ES.ToPrimitive(v.toStringOnlyObject), 7, 'toStringOnlyObject returns non-stringified toString');
+			st.equal(ES.ToPrimitive(v.valueOfOnlyObject), 4, 'valueOfOnlyObject returns valueOf');
+			st['throws'](function () { return ES.ToPrimitive(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+			st['throws'](function () { return ES.ToPrimitive(v.uncoercibleFnObject); }, TypeError, 'uncoercibleFnObject throws a TypeError');
+			st.end();
+		});
+
+		t.test('dates', function (st) {
+			var invalid = new Date(NaN);
+			st.equal(ES.ToPrimitive(invalid), Date.prototype.toString.call(invalid), 'invalid Date coerces to Date#toString');
+			var now = new Date();
+			st.equal(ES.ToPrimitive(now), Date.prototype.toString.call(now), 'Date coerces to Date#toString');
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ToBoolean', function (t) {
+		t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+		t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+		t.equal(false, ES.ToBoolean(false), 'false returns false');
+		t.equal(true, ES.ToBoolean(true), 'true returns true');
+
+		t.test('numbers', function (st) {
+			forEach(v.zeroes.concat(NaN), function (falsyNumber) {
+				st.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+			});
+			forEach(v.infinities.concat([42, 1]), function (truthyNumber) {
+				st.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+			});
+
+			st.end();
+		});
+
+		t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+		t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+
+		t.test('objects', function (st) {
+			forEach(v.objects, function (obj) {
+				st.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+			});
+			st.equal(true, ES.ToBoolean(v.uncoercibleObject), 'uncoercibleObject coerces to true');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ToNumber', function (t) {
+		t.equal(NaN, ES.ToNumber(undefined), 'undefined coerces to NaN');
+		t.equal(ES.ToNumber(null), 0, 'null coerces to +0');
+		t.equal(ES.ToNumber(false), 0, 'false coerces to +0');
+		t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+
+		t.test('numbers', function (st) {
+			st.equal(NaN, ES.ToNumber(NaN), 'NaN returns itself');
+			forEach(v.zeroes.concat(v.infinities, 42), function (num) {
+				st.equal(num, ES.ToNumber(num), num + ' returns itself');
+			});
+			forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+				st.equal(+numString, ES.ToNumber(numString), '"' + numString + '" coerces to ' + Number(numString));
+			});
+			st.end();
+		});
+
+		t.test('objects', function (st) {
+			forEach(v.objects, function (object) {
+				st.equal(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object)), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+			});
+			st['throws'](function () { return ES.ToNumber(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+			st.end();
+		});
+
+		t.test('binary literals', function (st) {
+			st.equal(ES.ToNumber('0b10'), NaN, '0b10 is NaN');
+			st.equal(ES.ToNumber({ toString: function () { return '0b11'; } }), NaN, 'Object that toStrings to 0b11 is NaN');
+
+			st.equal(ES.ToNumber('0b12'), NaN, '0b12 is NaN');
+			st.equal(ES.ToNumber({ toString: function () { return '0b112'; } }), NaN, 'Object that toStrings to 0b112 is NaN');
+			st.end();
+		});
+
+		t.test('octal literals', function (st) {
+			st.equal(ES.ToNumber('0o10'), NaN, '0o10 is NaN');
+			st.equal(ES.ToNumber({ toString: function () { return '0o11'; } }), NaN, 'Object that toStrings to 0o11 is NaN');
+
+			st.equal(ES.ToNumber('0o18'), NaN, '0o18 is NaN');
+			st.equal(ES.ToNumber({ toString: function () { return '0o118'; } }), NaN, 'Object that toStrings to 0o118 is NaN');
+			st.end();
+		});
+
+		t.test('signed hex numbers', function (st) {
+			st.equal(ES.ToNumber('-0xF'), NaN, '-0xF is NaN');
+			st.equal(ES.ToNumber(' -0xF '), NaN, 'space-padded -0xF is NaN');
+			st.equal(ES.ToNumber('+0xF'), NaN, '+0xF is NaN');
+			st.equal(ES.ToNumber(' +0xF '), NaN, 'space-padded +0xF is NaN');
+
+			st.end();
+		});
+
+		// TODO: check if this applies to ES5
+		t.test('trimming of whitespace and non-whitespace characters', function (st) {
+			var whitespace = ' \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u0085';
+			st.equal(ES.ToNumber(whitespace + 0 + whitespace), 0, 'whitespace is trimmed');
+
+			// Zero-width space (zws), next line character (nel), and non-character (bom) are not whitespace.
+			var nonWhitespaces = {
+				'\\u200b': '\u200b',
+				'\\ufffe': '\ufffe'
+			};
+
+			forEach(nonWhitespaces, function (desc, nonWS) {
+				st.equal(ES.ToNumber(nonWS + 0 + nonWS), NaN, 'non-whitespace ' + desc + ' not trimmed');
+			});
+
+			st.end();
+		});
+
+		t.test('dates', function (st) {
+			var invalid = new Date(NaN);
+			st.equal(ES.ToNumber(invalid), NaN, 'invalid Date coerces to NaN');
+			var now = +new Date();
+			st.equal(ES.ToNumber(new Date(now)), now, 'Date coerces to timestamp');
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ToInteger', function (t) {
+		forEach([NaN], function (num) {
+			t.equal(0, ES.ToInteger(num), debug(num) + ' returns +0');
+		});
+		forEach(v.zeroes.concat(v.infinities, 42), function (num) {
+			t.equal(num, ES.ToInteger(num), debug(num) + ' returns itself');
+			t.equal(-num, ES.ToInteger(-num), '-' + debug(num) + ' returns itself');
+		});
+		t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+		t['throws'](function () { return ES.ToInteger(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.end();
+	});
+
+	test('ToInt32', function (t) {
+		t.equal(ES.ToInt32(NaN), 0, 'NaN coerces to +0');
+		forEach(v.zeroes.concat(v.infinities), function (num) {
+			t.equal(ES.ToInt32(num), 0, num + ' returns +0');
+			t.equal(ES.ToInt32(-num), 0, '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToInt32(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToInt32(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToInt32(0x100000000 - 1), -1, '2^32 - 1 returns -1');
+		t.equal(ES.ToInt32(0x80000000), -0x80000000, '2^31 returns -2^31');
+		t.equal(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1, '2^31 - 1 returns 2^31 - 1');
+		forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+			t.equal(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num)), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+			t.equal(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num)), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+		});
+		t.end();
+	});
+
+	test('ToUint32', function (t) {
+		t.equal(0, ES.ToUint32(NaN), 'NaN coerces to +0');
+		forEach([0, Infinity], function (num) {
+			t.equal(0, ES.ToUint32(num), num + ' returns +0');
+			t.equal(0, ES.ToUint32(-num), '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToUint32(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToUint32(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1, '2^32 - 1 returns 2^32 - 1');
+		t.equal(ES.ToUint32(0x80000000), 0x80000000, '2^31 returns 2^31');
+		t.equal(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1, '2^31 - 1 returns 2^31 - 1');
+		forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+			t.equal(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num)), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+			t.equal(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num)), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+		});
+		t.end();
+	});
+
+	test('ToUint16', function (t) {
+		t.equal(0, ES.ToUint16(NaN), 'NaN coerces to +0');
+		forEach([0, Infinity], function (num) {
+			t.equal(0, ES.ToUint16(num), num + ' returns +0');
+			t.equal(0, ES.ToUint16(-num), '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToUint16(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToUint16(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToUint16(0x100000000 - 1), 0x10000 - 1, '2^32 - 1 returns 2^16 - 1');
+		t.equal(ES.ToUint16(0x80000000), 0, '2^31 returns +0');
+		t.equal(ES.ToUint16(0x80000000 - 1), 0x10000 - 1, '2^31 - 1 returns 2^16 - 1');
+		t.equal(ES.ToUint16(0x10000), 0, '2^16 returns +0');
+		t.equal(ES.ToUint16(0x10000 - 1), 0x10000 - 1, '2^16 - 1 returns 2^16 - 1');
+		t.end();
+	});
+
+	test('ToString', function (t) {
+		forEach(v.objects.concat(v.nonSymbolPrimitives), function (item) {
+			t.equal(ES.ToString(item), String(item), 'ES.ToString(' + debug(item) + ') ToStrings to String(' + debug(item) + ')');
+		});
+
+		t['throws'](function () { return ES.ToString(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+
+		t.end();
+	});
+
+	test('ToObject', function (t) {
+		t['throws'](function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+		t['throws'](function () { return ES.ToObject(null); }, TypeError, 'null throws');
+		forEach(v.numbers, function (number) {
+			var obj = ES.ToObject(number);
+			t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+			t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+			t.equal(obj.valueOf(), number, 'object of ' + number + ' coerces to ' + number);
+		});
+		t.end();
+	});
+
+	test('CheckObjectCoercible', function (t) {
+		t['throws'](function () { return ES.CheckObjectCoercible(undefined); }, TypeError, 'undefined throws');
+		t['throws'](function () { return ES.CheckObjectCoercible(null); }, TypeError, 'null throws');
+		var checkCoercible = function (value) {
+			t.doesNotThrow(function () { return ES.CheckObjectCoercible(value); }, debug(value) + ' does not throw');
+		};
+		forEach(v.objects.concat(v.nonNullPrimitives), checkCoercible);
+		t.end();
+	});
+
+	test('IsCallable', function (t) {
+		t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+		var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(v.nonFunctions);
+		forEach(nonCallables, function (nonCallable) {
+			t.equal(false, ES.IsCallable(nonCallable), debug(nonCallable) + ' is not callable');
+		});
+		t.end();
+	});
+
+	test('SameValue', function (t) {
+		t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+		t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+		forEach(v.objects.concat(v.primitives), function (val) {
+			t.equal(val === val, ES.SameValue(val, val), debug(val) + ' is SameValue to itself');
+		});
+		t.end();
+	});
+
+	test('Type', function (t) {
+		t.equal(ES.Type(), 'Undefined', 'Type() is Undefined');
+		t.equal(ES.Type(undefined), 'Undefined', 'Type(undefined) is Undefined');
+		t.equal(ES.Type(null), 'Null', 'Type(null) is Null');
+		t.equal(ES.Type(true), 'Boolean', 'Type(true) is Boolean');
+		t.equal(ES.Type(false), 'Boolean', 'Type(false) is Boolean');
+		t.equal(ES.Type(0), 'Number', 'Type(0) is Number');
+		t.equal(ES.Type(NaN), 'Number', 'Type(NaN) is Number');
+		t.equal(ES.Type('abc'), 'String', 'Type("abc") is String');
+		t.equal(ES.Type(function () {}), 'Object', 'Type(function () {}) is Object');
+		t.equal(ES.Type({}), 'Object', 'Type({}) is Object');
+
+		t.end();
+	});
+
+	assertRecordTests(ES, test);
+
+	test('IsAccessorDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.IsAccessorDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t.equal(ES.IsAccessorDescriptor(), false, 'no value is not an Accessor Descriptor');
+		t.equal(ES.IsAccessorDescriptor(undefined), false, 'undefined value is not an Accessor Descriptor');
+
+		t.equal(ES.IsAccessorDescriptor(v.accessorDescriptor()), true, 'accessor descriptor is an Accessor Descriptor');
+		t.equal(ES.IsAccessorDescriptor(v.mutatorDescriptor()), true, 'mutator descriptor is an Accessor Descriptor');
+		t.equal(ES.IsAccessorDescriptor(v.dataDescriptor()), false, 'data descriptor is not an Accessor Descriptor');
+		t.equal(ES.IsAccessorDescriptor(v.genericDescriptor()), false, 'generic descriptor is not an Accessor Descriptor');
+
+		t.end();
+	});
+
+	test('IsDataDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.IsDataDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t.equal(ES.IsDataDescriptor(), false, 'no value is not a Data Descriptor');
+		t.equal(ES.IsDataDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+		t.equal(ES.IsDataDescriptor(v.accessorDescriptor()), false, 'accessor descriptor is not a Data Descriptor');
+		t.equal(ES.IsDataDescriptor(v.mutatorDescriptor()), false, 'mutator descriptor is not a Data Descriptor');
+		t.equal(ES.IsDataDescriptor(v.dataDescriptor()), true, 'data descriptor is a Data Descriptor');
+		t.equal(ES.IsDataDescriptor(v.genericDescriptor()), false, 'generic descriptor is not a Data Descriptor');
+
+		t.end();
+	});
+
+	test('IsGenericDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.IsGenericDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t.equal(ES.IsGenericDescriptor(), false, 'no value is not a Data Descriptor');
+		t.equal(ES.IsGenericDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+		t.equal(ES.IsGenericDescriptor(v.accessorDescriptor()), false, 'accessor descriptor is not a generic Descriptor');
+		t.equal(ES.IsGenericDescriptor(v.mutatorDescriptor()), false, 'mutator descriptor is not a generic Descriptor');
+		t.equal(ES.IsGenericDescriptor(v.dataDescriptor()), false, 'data descriptor is not a generic Descriptor');
+
+		t.equal(ES.IsGenericDescriptor(v.genericDescriptor()), true, 'generic descriptor is a generic Descriptor');
+
+		t.end();
+	});
+
+	test('FromPropertyDescriptor', function (t) {
+		t.equal(ES.FromPropertyDescriptor(), undefined, 'no value begets undefined');
+		t.equal(ES.FromPropertyDescriptor(undefined), undefined, 'undefined value begets undefined');
+
+		forEach(v.nonNullPrimitives.concat(null), function (primitive) {
+			t['throws'](
+				function () { ES.FromPropertyDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		var accessor = v.accessorDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(accessor), {
+			get: accessor['[[Get]]'],
+			set: accessor['[[Set]]'],
+			enumerable: !!accessor['[[Enumerable]]'],
+			configurable: !!accessor['[[Configurable]]']
+		});
+
+		var mutator = v.mutatorDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(mutator), {
+			get: mutator['[[Get]]'],
+			set: mutator['[[Set]]'],
+			enumerable: !!mutator['[[Enumerable]]'],
+			configurable: !!mutator['[[Configurable]]']
+		});
+		var data = v.dataDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(data), {
+			value: data['[[Value]]'],
+			writable: data['[[Writable]]'],
+			enumerable: !!data['[[Enumerable]]'],
+			configurable: !!data['[[Configurable]]']
+		});
+
+		t['throws'](
+			function () { ES.FromPropertyDescriptor(v.genericDescriptor()); },
+			TypeError,
+			'a complete Property Descriptor is required'
+		);
+
+		t.end();
+	});
+
+	test('ToPropertyDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.ToPropertyDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		var accessor = v.accessorDescriptor();
+		t.deepEqual(ES.ToPropertyDescriptor({
+			get: accessor['[[Get]]'],
+			enumerable: !!accessor['[[Enumerable]]'],
+			configurable: !!accessor['[[Configurable]]']
+		}), accessor);
+
+		var mutator = v.mutatorDescriptor();
+		t.deepEqual(ES.ToPropertyDescriptor({
+			set: mutator['[[Set]]'],
+			enumerable: !!mutator['[[Enumerable]]'],
+			configurable: !!mutator['[[Configurable]]']
+		}), mutator);
+
+		var data = v.descriptors.nonConfigurable(v.dataDescriptor());
+		t.deepEqual(ES.ToPropertyDescriptor({
+			value: data['[[Value]]'],
+			writable: data['[[Writable]]'],
+			configurable: !!data['[[Configurable]]']
+		}), data);
+
+		var both = v.bothDescriptor();
+		t['throws'](
+			function () {
+				ES.ToPropertyDescriptor({ get: both['[[Get]]'], value: both['[[Value]]'] });
+			},
+			TypeError,
+			'data and accessor descriptors are mutually exclusive'
+		);
+
+		t['throws'](
+			function () { ES.ToPropertyDescriptor({ get: 'not callable' }); },
+			TypeError,
+			'"get" must be undefined or callable'
+		);
+
+		t['throws'](
+			function () { ES.ToPropertyDescriptor({ set: 'not callable' }); },
+			TypeError,
+			'"set" must be undefined or callable'
+		);
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			if (typeof nonFunction !== 'undefined') {
+				t['throws'](
+					function () { ES.ToPropertyDescriptor({ get: nonFunction }); },
+					TypeError,
+					'`.get` has ' + debug(nonFunction) + ', which is not a Function'
+				);
+				t['throws'](
+					function () { ES.ToPropertyDescriptor({ set: nonFunction }); },
+					TypeError,
+					'`.set` has ' + debug(nonFunction) + ', which is not a Function'
+				);
+			}
+		});
+
+		forEach(['get', 'set'], function (accessorName) {
+			forEach(['value', 'writable'], function (dataName) {
+				var o = {};
+				o[accessorName] = undefined;
+				o[dataName] = undefined;
+
+				t['throws'](
+					function () { ES.ToPropertyDescriptor(o); },
+					TypeError,
+					accessorName + ' + ' + dataName + ' is invalid'
+				);
+			});
+		});
+
+		t.end();
+	});
+
+	test('Abstract Equality Comparison', function (t) {
+		t.test('same types use ===', function (st) {
+			forEach(v.primitives.concat(v.objects), function (value) {
+				st.equal(ES['Abstract Equality Comparison'](value, value), value === value, debug(value) + ' is abstractly equal to itself');
+			});
+			st.end();
+		});
+
+		t.test('different types coerce', function (st) {
+			var pairs = [
+				[null, undefined],
+				[3, '3'],
+				[true, '3'],
+				[true, 3],
+				[false, 0],
+				[false, '0'],
+				[3, [3]],
+				['3', [3]],
+				[true, [1]],
+				[false, [0]],
+				[String(v.coercibleObject), v.coercibleObject],
+				[Number(String(v.coercibleObject)), v.coercibleObject],
+				[Number(v.coercibleObject), v.coercibleObject],
+				[String(Number(v.coercibleObject)), v.coercibleObject]
+			];
+			forEach(pairs, function (pair) {
+				var a = pair[0];
+				var b = pair[1];
+				// eslint-disable-next-line eqeqeq
+				st.equal(ES['Abstract Equality Comparison'](a, b), a == b, debug(a) + ' == ' + debug(b));
+				// eslint-disable-next-line eqeqeq
+				st.equal(ES['Abstract Equality Comparison'](b, a), b == a, debug(b) + ' == ' + debug(a));
+			});
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('Strict Equality Comparison', function (t) {
+		t.test('same types use ===', function (st) {
+			forEach(v.primitives.concat(v.objects), function (value) {
+				st.equal(ES['Strict Equality Comparison'](value, value), value === value, debug(value) + ' is strictly equal to itself');
+			});
+			st.end();
+		});
+
+		t.test('different types are not ===', function (st) {
+			var pairs = [
+				[null, undefined],
+				[3, '3'],
+				[true, '3'],
+				[true, 3],
+				[false, 0],
+				[false, '0'],
+				[3, [3]],
+				['3', [3]],
+				[true, [1]],
+				[false, [0]],
+				[String(v.coercibleObject), v.coercibleObject],
+				[Number(String(v.coercibleObject)), v.coercibleObject],
+				[Number(v.coercibleObject), v.coercibleObject],
+				[String(Number(v.coercibleObject)), v.coercibleObject]
+			];
+			forEach(pairs, function (pair) {
+				var a = pair[0];
+				var b = pair[1];
+				st.equal(ES['Strict Equality Comparison'](a, b), a === b, debug(a) + ' === ' + debug(b));
+				st.equal(ES['Strict Equality Comparison'](b, a), b === a, debug(b) + ' === ' + debug(a));
+			});
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('Abstract Relational Comparison', function (t) {
+		t.test('at least one operand is NaN', function (st) {
+			st.equal(ES['Abstract Relational Comparison'](NaN, {}, true), undefined, 'LeftFirst: first is NaN, returns undefined');
+			st.equal(ES['Abstract Relational Comparison']({}, NaN, true), undefined, 'LeftFirst: second is NaN, returns undefined');
+			st.equal(ES['Abstract Relational Comparison'](NaN, {}, false), undefined, '!LeftFirst: first is NaN, returns undefined');
+			st.equal(ES['Abstract Relational Comparison']({}, NaN, false), undefined, '!LeftFirst: second is NaN, returns undefined');
+			st.end();
+		});
+
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () { ES['Abstract Relational Comparison'](3, 4, nonBoolean); },
+				TypeError,
+				debug(nonBoolean) + ' is not a Boolean'
+			);
+		});
+
+		forEach(v.zeroes, function (zero) {
+			t.equal(ES['Abstract Relational Comparison'](zero, 1, true), true, 'LeftFirst: ' + debug(zero) + ' is less than 1');
+			t.equal(ES['Abstract Relational Comparison'](zero, 1, false), true, '!LeftFirst: ' + debug(zero) + ' is less than 1');
+			t.equal(ES['Abstract Relational Comparison'](1, zero, true), false, 'LeftFirst: 1 is not less than ' + debug(zero));
+			t.equal(ES['Abstract Relational Comparison'](1, zero, false), false, '!LeftFirst: 1 is not less than ' + debug(zero));
+
+			t.equal(ES['Abstract Relational Comparison'](zero, zero, true), false, 'LeftFirst: ' + debug(zero) + ' is not less than ' + debug(zero));
+			t.equal(ES['Abstract Relational Comparison'](zero, zero, false), false, '!LeftFirst: ' + debug(zero) + ' is not less than ' + debug(zero));
+		});
+
+		t.equal(ES['Abstract Relational Comparison'](Infinity, -Infinity, true), false, 'LeftFirst: ∞ is not less than -∞');
+		t.equal(ES['Abstract Relational Comparison'](Infinity, -Infinity, false), false, '!LeftFirst: ∞ is not less than -∞');
+		t.equal(ES['Abstract Relational Comparison'](-Infinity, Infinity, true), true, 'LeftFirst: -∞ is less than ∞');
+		t.equal(ES['Abstract Relational Comparison'](-Infinity, Infinity, false), true, '!LeftFirst: -∞ is less than ∞');
+		t.equal(ES['Abstract Relational Comparison'](-Infinity, 0, true), true, 'LeftFirst: -∞ is less than +0');
+		t.equal(ES['Abstract Relational Comparison'](-Infinity, 0, false), true, '!LeftFirst: -∞ is less than +0');
+		t.equal(ES['Abstract Relational Comparison'](0, -Infinity, true), false, 'LeftFirst: +0 is not less than -∞');
+		t.equal(ES['Abstract Relational Comparison'](0, -Infinity, false), false, '!LeftFirst: +0 is not less than -∞');
+
+		t.equal(ES['Abstract Relational Comparison'](3, 4, true), true, 'LeftFirst: 3 is less than 4');
+		t.equal(ES['Abstract Relational Comparison'](4, 3, true), false, 'LeftFirst: 3 is not less than 4');
+		t.equal(ES['Abstract Relational Comparison'](3, 4, false), true, '!LeftFirst: 3 is less than 4');
+		t.equal(ES['Abstract Relational Comparison'](4, 3, false), false, '!LeftFirst: 3 is not less than 4');
+
+		t.equal(ES['Abstract Relational Comparison']('3', '4', true), true, 'LeftFirst: "3" is less than "4"');
+		t.equal(ES['Abstract Relational Comparison']('4', '3', true), false, 'LeftFirst: "3" is not less than "4"');
+		t.equal(ES['Abstract Relational Comparison']('3', '4', false), true, '!LeftFirst: "3" is less than "4"');
+		t.equal(ES['Abstract Relational Comparison']('4', '3', false), false, '!LeftFirst: "3" is not less than "4"');
+
+		t.equal(ES['Abstract Relational Comparison']('a', 'abc', true), true, 'LeftFirst: "a" is less than "abc"');
+		t.equal(ES['Abstract Relational Comparison']('abc', 'a', true), false, 'LeftFirst: "abc" is not less than "a"');
+		t.equal(ES['Abstract Relational Comparison']('a', 'abc', false), true, '!LeftFirst: "a" is less than "abc"');
+		t.equal(ES['Abstract Relational Comparison']('abc', 'a', false), false, '!LeftFirst: "abc" is not less than "a"');
+
+		t.equal(ES['Abstract Relational Comparison'](v.coercibleObject, 42, true), true, 'LeftFirst: coercible object is less than 42');
+		t.equal(ES['Abstract Relational Comparison'](42, v.coercibleObject, true), false, 'LeftFirst: 42 is not less than coercible object');
+		t.equal(ES['Abstract Relational Comparison'](v.coercibleObject, 42, false), true, '!LeftFirst: coercible object is less than 42');
+		t.equal(ES['Abstract Relational Comparison'](42, v.coercibleObject, false), false, '!LeftFirst: 42 is not less than coercible object');
+
+		t.equal(ES['Abstract Relational Comparison'](v.coercibleObject, '3', true), false, 'LeftFirst: coercible object is not less than "3"');
+		t.equal(ES['Abstract Relational Comparison']('3', v.coercibleObject, true), false, 'LeftFirst: "3" is not less than coercible object');
+		t.equal(ES['Abstract Relational Comparison'](v.coercibleObject, '3', false), false, '!LeftFirst: coercible object is not less than "3"');
+		t.equal(ES['Abstract Relational Comparison']('3', v.coercibleObject, false), false, '!LeftFirst: "3" is not less than coercible object');
+
+		t.end();
+	});
+
+	test('SecFromTime', function (t) {
+		var now = new Date();
+		t.equal(ES.SecFromTime(now.getTime()), now.getUTCSeconds(), 'second from Date timestamp matches getUTCSeconds');
+		t.end();
+	});
+
+	test('MinFromTime', function (t) {
+		var now = new Date();
+		t.equal(ES.MinFromTime(now.getTime()), now.getUTCMinutes(), 'minute from Date timestamp matches getUTCMinutes');
+		t.end();
+	});
+
+	test('HourFromTime', function (t) {
+		var now = new Date();
+		t.equal(ES.HourFromTime(now.getTime()), now.getUTCHours(), 'hour from Date timestamp matches getUTCHours');
+		t.end();
+	});
+
+	test('msFromTime', function (t) {
+		var now = new Date();
+		t.equal(ES.msFromTime(now.getTime()), now.getUTCMilliseconds(), 'ms from Date timestamp matches getUTCMilliseconds');
+		t.end();
+	});
+
+	var msPerSecond = 1e3;
+	var msPerMinute = 60 * msPerSecond;
+	var msPerHour = 60 * msPerMinute;
+	var msPerDay = 24 * msPerHour;
+
+	test('Day', function (t) {
+		var time = Date.UTC(2019, 8, 10, 2, 3, 4, 5);
+		var add = 2.5;
+		var later = new Date(time + (add * msPerDay));
+
+		t.equal(ES.Day(later.getTime()), ES.Day(time) + Math.floor(add), 'adding 2.5 days worth of ms, gives a Day delta of 2');
+		t.end();
+	});
+
+	test('DayFromYear', function (t) {
+		t.equal(ES.DayFromYear(2021) - ES.DayFromYear(2020), 366, '2021 is a leap year, has 366 days');
+		t.equal(ES.DayFromYear(2020) - ES.DayFromYear(2019), 365, '2020 is not a leap year, has 365 days');
+		t.equal(ES.DayFromYear(2019) - ES.DayFromYear(2018), 365, '2019 is not a leap year, has 365 days');
+		t.equal(ES.DayFromYear(2018) - ES.DayFromYear(2017), 365, '2018 is not a leap year, has 365 days');
+		t.equal(ES.DayFromYear(2017) - ES.DayFromYear(2016), 366, '2017 is a leap year, has 366 days');
+
+		t.end();
+	});
+
+	test('TimeWithinDay', function (t) {
+		var time = Date.UTC(2019, 8, 10, 2, 3, 4, 5);
+		var add = 2.5;
+		var later = new Date(time + (add * msPerDay));
+
+		t.equal(ES.TimeWithinDay(later.getTime()), ES.TimeWithinDay(time) + (0.5 * msPerDay), 'adding 2.5 days worth of ms, gives a TimeWithinDay delta of +0.5');
+		t.end();
+	});
+
+	test('TimeFromYear', function (t) {
+		for (var i = 1900; i < 2100; i += 1) {
+			t.equal(ES.TimeFromYear(i), Date.UTC(i, 0, 1), 'TimeFromYear matches a Date object’s year: ' + i);
+		}
+		t.end();
+	});
+
+	test('YearFromTime', function (t) {
+		for (var i = 1900; i < 2100; i += 1) {
+			t.equal(ES.YearFromTime(Date.UTC(i, 0, 1)), i, 'YearFromTime matches a Date object’s year on 1/1: ' + i);
+			t.equal(ES.YearFromTime(Date.UTC(i, 10, 1)), i, 'YearFromTime matches a Date object’s year on 10/1: ' + i);
+		}
+		t.end();
+	});
+
+	test('WeekDay', function (t) {
+		var now = new Date();
+		var today = now.getUTCDay();
+		for (var i = 0; i < 7; i += 1) {
+			var weekDay = ES.WeekDay(now.getTime() + (i * msPerDay));
+			t.equal(weekDay, (today + i) % 7, i + ' days after today (' + today + '), WeekDay is ' + weekDay);
+		}
+		t.end();
+	});
+
+	test('DaysInYear', function (t) {
+		t.equal(ES.DaysInYear(2021), 365, '2021 is not a leap year');
+		t.equal(ES.DaysInYear(2020), 366, '2020 is a leap year');
+		t.equal(ES.DaysInYear(2019), 365, '2019 is not a leap year');
+		t.equal(ES.DaysInYear(2018), 365, '2018 is not a leap year');
+		t.equal(ES.DaysInYear(2017), 365, '2017 is not a leap year');
+		t.equal(ES.DaysInYear(2016), 366, '2016 is a leap year');
+		t.equal(ES.DaysInYear(2000), 366, '2000 is a leap year');
+		t.equal(ES.DaysInYear(1900), 365, '1900 is not a leap year');
+
+		t.end();
+	});
+
+	test('InLeapYear', function (t) {
+		t.equal(ES.InLeapYear(Date.UTC(2021, 0, 1)), 0, '2021 is not a leap year');
+		t.equal(ES.InLeapYear(Date.UTC(2020, 0, 1)), 1, '2020 is a leap year');
+		t.equal(ES.InLeapYear(Date.UTC(2019, 0, 1)), 0, '2019 is not a leap year');
+		t.equal(ES.InLeapYear(Date.UTC(2018, 0, 1)), 0, '2018 is not a leap year');
+		t.equal(ES.InLeapYear(Date.UTC(2017, 0, 1)), 0, '2017 is not a leap year');
+		t.equal(ES.InLeapYear(Date.UTC(2016, 0, 1)), 1, '2016 is a leap year');
+
+		t.end();
+	});
+
+	test('DayWithinYear', function (t) {
+		t.equal(ES.DayWithinYear(Date.UTC(2019, 0, 1)), 0, '1/1 is the 1st day');
+		t.equal(ES.DayWithinYear(Date.UTC(2019, 11, 31)), 364, '12/31 is the 365th day in a non leap year');
+		t.equal(ES.DayWithinYear(Date.UTC(2016, 11, 31)), 365, '12/31 is the 366th day in a leap year');
+
+		t.end();
+	});
+
+	test('MonthFromTime', function (t) {
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 0, 1)), 0, 'non-leap: 1/1 gives January');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 0, 31)), 0, 'non-leap: 1/31 gives January');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 1, 1)), 1, 'non-leap: 2/1 gives February');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 1, 28)), 1, 'non-leap: 2/28 gives February');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 1, 29)), 2, 'non-leap: 2/29 gives March');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 2, 1)), 2, 'non-leap: 3/1 gives March');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 2, 31)), 2, 'non-leap: 3/31 gives March');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 3, 1)), 3, 'non-leap: 4/1 gives April');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 3, 30)), 3, 'non-leap: 4/30 gives April');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 4, 1)), 4, 'non-leap: 5/1 gives May');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 4, 31)), 4, 'non-leap: 5/31 gives May');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 5, 1)), 5, 'non-leap: 6/1 gives June');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 5, 30)), 5, 'non-leap: 6/30 gives June');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 6, 1)), 6, 'non-leap: 7/1 gives July');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 6, 31)), 6, 'non-leap: 7/31 gives July');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 7, 1)), 7, 'non-leap: 8/1 gives August');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 7, 30)), 7, 'non-leap: 8/30 gives August');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 8, 1)), 8, 'non-leap: 9/1 gives September');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 8, 30)), 8, 'non-leap: 9/30 gives September');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 9, 1)), 9, 'non-leap: 10/1 gives October');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 9, 31)), 9, 'non-leap: 10/31 gives October');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 10, 1)), 10, 'non-leap: 11/1 gives November');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 10, 30)), 10, 'non-leap: 11/30 gives November');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 11, 1)), 11, 'non-leap: 12/1 gives December');
+		t.equal(ES.MonthFromTime(Date.UTC(2019, 11, 31)), 11, 'non-leap: 12/31 gives December');
+
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 0, 1)), 0, 'leap: 1/1 gives January');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 0, 31)), 0, 'leap: 1/31 gives January');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 1, 1)), 1, 'leap: 2/1 gives February');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 1, 28)), 1, 'leap: 2/28 gives February');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 1, 29)), 1, 'leap: 2/29 gives February');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 2, 1)), 2, 'leap: 3/1 gives March');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 2, 31)), 2, 'leap: 3/31 gives March');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 3, 1)), 3, 'leap: 4/1 gives April');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 3, 30)), 3, 'leap: 4/30 gives April');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 4, 1)), 4, 'leap: 5/1 gives May');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 4, 31)), 4, 'leap: 5/31 gives May');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 5, 1)), 5, 'leap: 6/1 gives June');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 5, 30)), 5, 'leap: 6/30 gives June');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 6, 1)), 6, 'leap: 7/1 gives July');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 6, 31)), 6, 'leap: 7/31 gives July');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 7, 1)), 7, 'leap: 8/1 gives August');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 7, 30)), 7, 'leap: 8/30 gives August');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 8, 1)), 8, 'leap: 9/1 gives September');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 8, 30)), 8, 'leap: 9/30 gives September');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 9, 1)), 9, 'leap: 10/1 gives October');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 9, 31)), 9, 'leap: 10/31 gives October');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 10, 1)), 10, 'leap: 11/1 gives November');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 10, 30)), 10, 'leap: 11/30 gives November');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 11, 1)), 11, 'leap: 12/1 gives December');
+		t.equal(ES.MonthFromTime(Date.UTC(2016, 11, 31)), 11, 'leap: 12/31 gives December');
+		t.end();
+	});
+
+	test('DateFromTime', function (t) {
+		var i;
+		for (i = 1; i <= 28; i += 1) {
+			t.equal(ES.DateFromTime(Date.UTC(2019, 1, i)), i, '2019.02.' + i + ' is date ' + i);
+		}
+		for (i = 1; i <= 29; i += 1) {
+			t.equal(ES.DateFromTime(Date.UTC(2016, 1, i)), i, '2016.02.' + i + ' is date ' + i);
+		}
+		for (i = 1; i <= 30; i += 1) {
+			t.equal(ES.DateFromTime(Date.UTC(2019, 2, i)), i, '2019.03.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 3, i)), i, '2019.04.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 5, i)), i, '2019.06.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 7, i)), i, '2019.08.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 8, i)), i, '2019.09.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 10, i)), i, '2019.11.' + i + ' is date ' + i);
+		}
+		for (i = 1; i <= 31; i += 1) {
+			t.equal(ES.DateFromTime(Date.UTC(2019, 0, i)), i, '2019.01.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 4, i)), i, '2019.05.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 6, i)), i, '2019.07.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 9, i)), i, '2019.10.' + i + ' is date ' + i);
+			t.equal(ES.DateFromTime(Date.UTC(2019, 11, i)), i, '2019.12.' + i + ' is date ' + i);
+		}
+		t.end();
+	});
+
+	test('MakeDay', function (t) {
+		forEach([NaN, Infinity, -Infinity], function (nonFiniteNumber) {
+			t.equal(ES.MakeDay(nonFiniteNumber, 0, 0), NaN, 'year: ' + debug(nonFiniteNumber) + ' is not finite');
+			t.equal(ES.MakeDay(0, nonFiniteNumber, 0), NaN, 'month: ' + debug(nonFiniteNumber) + ' is not finite');
+			t.equal(ES.MakeDay(0, 0, nonFiniteNumber), NaN, 'date: ' + debug(nonFiniteNumber) + ' is not finite');
+		});
+
+		var day2015 = 16687;
+		t.equal(ES.MakeDay(2015, 8, 9), day2015, '2015.09.09 is day 16687');
+		var day2016 = day2015 + 366; // 2016 is a leap year
+		t.equal(ES.MakeDay(2016, 8, 9), day2016, '2015.09.09 is day 17053');
+		var day2017 = day2016 + 365;
+		t.equal(ES.MakeDay(2017, 8, 9), day2017, '2017.09.09 is day 17418');
+		var day2018 = day2017 + 365;
+		t.equal(ES.MakeDay(2018, 8, 9), day2018, '2018.09.09 is day 17783');
+		var day2019 = day2018 + 365;
+		t.equal(ES.MakeDay(2019, 8, 9), day2019, '2019.09.09 is day 18148');
+
+		t.end();
+	});
+
+	test('MakeDate', function (t) {
+		forEach(v.infinities.concat(NaN), function (nonFiniteNumber) {
+			t.equal(ES.MakeDate(nonFiniteNumber, 0), NaN, debug(nonFiniteNumber) + ' is not a finite `day`');
+			t.equal(ES.MakeDate(0, nonFiniteNumber), NaN, debug(nonFiniteNumber) + ' is not a finite `time`');
+		});
+		t.equal(ES.MakeDate(0, 0), 0, 'zero day and zero time is zero date');
+		t.equal(ES.MakeDate(0, 123), 123, 'zero day and nonzero time is a date of the "time"');
+		t.equal(ES.MakeDate(1, 0), msPerDay, 'day of 1 and zero time is a date of "ms per day"');
+		t.equal(ES.MakeDate(3, 0), 3 * msPerDay, 'day of 3 and zero time is a date of thrice "ms per day"');
+		t.equal(ES.MakeDate(1, 123), msPerDay + 123, 'day of 1 and nonzero time is a date of "ms per day" plus the "time"');
+		t.equal(ES.MakeDate(3, 123), (3 * msPerDay) + 123, 'day of 3 and nonzero time is a date of thrice "ms per day" plus the "time"');
+
+		t.end();
+	});
+
+	test('MakeTime', function (t) {
+		forEach(v.infinities.concat(NaN), function (nonFiniteNumber) {
+			t.equal(ES.MakeTime(nonFiniteNumber, 0, 0, 0), NaN, debug(nonFiniteNumber) + ' is not a finite `hour`');
+			t.equal(ES.MakeTime(0, nonFiniteNumber, 0, 0), NaN, debug(nonFiniteNumber) + ' is not a finite `min`');
+			t.equal(ES.MakeTime(0, 0, nonFiniteNumber, 0), NaN, debug(nonFiniteNumber) + ' is not a finite `sec`');
+			t.equal(ES.MakeTime(0, 0, 0, nonFiniteNumber), NaN, debug(nonFiniteNumber) + ' is not a finite `ms`');
+		});
+
+		t.equal(
+			ES.MakeTime(1.2, 2.3, 3.4, 4.5),
+			(1 * msPerHour) + (2 * msPerMinute) + (3 * msPerSecond) + 4,
+			'all numbers are converted to integer, multiplied by the right number of ms, and summed'
+		);
+
+		t.end();
+	});
+
+	test('TimeClip', function (t) {
+		forEach(v.infinities.concat(NaN), function (nonFiniteNumber) {
+			t.equal(ES.TimeClip(nonFiniteNumber), NaN, debug(nonFiniteNumber) + ' is not a finite `time`');
+		});
+		t.equal(ES.TimeClip(8.64e15 + 1), NaN, '8.64e15 is the largest magnitude considered "finite"');
+		t.equal(ES.TimeClip(-8.64e15 - 1), NaN, '-8.64e15 is the largest magnitude considered "finite"');
+
+		forEach(v.zeroes.concat([-10, 10, +new Date()]), function (time) {
+			t.looseEqual(ES.TimeClip(time), time, debug(time) + ' is a time of ' + debug(time));
+		});
+
+		t.end();
+	});
+
+	test('modulo', function (t) {
+		t.equal(3 % 2, 1, '+3 % 2 is +1');
+		t.equal(ES.modulo(3, 2), 1, '+3 mod 2 is +1');
+
+		t.equal(-3 % 2, -1, '-3 % 2 is -1');
+		t.equal(ES.modulo(-3, 2), 1, '-3 mod 2 is +1');
+		t.end();
+	});
+};
+
+var es2015 = function ES2015(ES, ops, expectedMissing, skips) {
+	es5(ES, ops, expectedMissing, assign(assign({}, skips), {
+		CheckObjectCoercible: true,
+		FromPropertyDescriptor: true,
+		ToNumber: true,
+		ToString: true,
+		Type: true
+	}));
+	var test = makeTest(skips);
+
+	var getNamelessFunction = function () {
+		var f = Object(function () {});
+		try {
+			delete f.name;
+		} catch (e) { /**/ }
+		return f;
+	};
+
+	test('AdvanceStringIndex', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.AdvanceStringIndex(nonString); },
+				TypeError,
+				'"S" argument must be a String; ' + debug(nonString) + ' is not'
+			);
+		});
+
+		var notInts = v.nonNumbers.concat(
+			v.nonIntegerNumbers,
+			v.infinities,
+			[NaN, [], new Date(), Math.pow(2, 53), -1]
+		);
+		forEach(notInts, function (nonInt) {
+			t['throws'](
+				function () { ES.AdvanceStringIndex('abc', nonInt); },
+				TypeError,
+				'"index" argument must be an integer, ' + debug(nonInt) + ' is not.'
+			);
+		});
+
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () { ES.AdvanceStringIndex('abc', 0, nonBoolean); },
+				TypeError,
+				debug(nonBoolean) + ' is not a Boolean'
+			);
+		});
+
+		var str = 'a' + wholePoo + 'c';
+
+		t.test('non-unicode mode', function (st) {
+			for (var i = 0; i < str.length + 2; i += 1) {
+				st.equal(ES.AdvanceStringIndex(str, i, false), i + 1, i + ' advances to ' + (i + 1));
+			}
+
+			st.end();
+		});
+
+		t.test('unicode mode', function (st) {
+			st.equal(ES.AdvanceStringIndex(str, 0, true), 1, '0 advances to 1');
+			st.equal(ES.AdvanceStringIndex(str, 1, true), 3, '1 advances to 3');
+			st.equal(ES.AdvanceStringIndex(str, 2, true), 3, '2 advances to 3');
+			st.equal(ES.AdvanceStringIndex(str, 3, true), 4, '3 advances to 4');
+			st.equal(ES.AdvanceStringIndex(str, 4, true), 5, '4 advances to 5');
+
+			st.end();
+		});
+
+		t.test('lone surrogates', function (st) {
+			var halfPoo = 'a' + leadingPoo + 'c';
+
+			st.equal(ES.AdvanceStringIndex(halfPoo, 0, true), 1, '0 advances to 1');
+			st.equal(ES.AdvanceStringIndex(halfPoo, 1, true), 2, '1 advances to 2');
+			st.equal(ES.AdvanceStringIndex(halfPoo, 2, true), 3, '2 advances to 3');
+			st.equal(ES.AdvanceStringIndex(halfPoo, 3, true), 4, '3 advances to 4');
+
+			st.end();
+		});
+
+		t.test('surrogate pairs', function (st) {
+			var lowestPair = String.fromCharCode('0xD800') + String.fromCharCode('0xDC00');
+			var highestPair = String.fromCharCode('0xDBFF') + String.fromCharCode('0xDFFF');
+
+			st.equal(ES.AdvanceStringIndex(lowestPair, 0, true), 2, 'lowest surrogate pair, 0 -> 2');
+			st.equal(ES.AdvanceStringIndex(highestPair, 0, true), 2, 'highest surrogate pair, 0 -> 2');
+			st.equal(ES.AdvanceStringIndex(wholePoo, 0, true), 2, 'poop, 0 -> 2');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ArrayCreate', function (t) {
+		forEach(v.nonIntegerNumbers.concat([-1]), function (nonIntegerNumber) {
+			t['throws'](
+				function () { ES.ArrayCreate(nonIntegerNumber); },
+				TypeError,
+				'length must be an integer number >= 0'
+			);
+		});
+
+		t['throws'](
+			function () { ES.ArrayCreate(Math.pow(2, 32)); },
+			RangeError,
+			'length must be < 2**32'
+		);
+
+		t.deepEqual(ES.ArrayCreate(-0), [], 'length of -0 creates an empty array');
+		t.deepEqual(ES.ArrayCreate(0), [], 'length of +0 creates an empty array');
+		// eslint-disable-next-line no-sparse-arrays, comma-spacing
+		t.deepEqual(ES.ArrayCreate(1), [,], 'length of 1 creates a sparse array of length 1');
+		// eslint-disable-next-line no-sparse-arrays, comma-spacing
+		t.deepEqual(ES.ArrayCreate(2), [,,], 'length of 2 creates a sparse array of length 2');
+
+		t.test('proto argument', { skip: !$setProto }, function (st) {
+			var fakeProto = {
+				push: { toString: function () { return 'not array push'; } }
+			};
+			st.equal(ES.ArrayCreate(0, fakeProto).push, fakeProto.push, 'passing the proto argument works');
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ArraySetLength', function (t) {
+		forEach(v.primitives.concat(v.objects), function (nonArray) {
+			t['throws'](
+				function () { ES.ArraySetLength(nonArray, { '[[Value]]': 0 }); },
+				TypeError,
+				'A: ' + debug(nonArray) + ' is not an Array'
+			);
+		});
+
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.ArraySetLength([], primitive); },
+				TypeError,
+				'Desc: ' + debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t.test('making length nonwritable', { skip: !getOwnPropertyDescriptor }, function (st) {
+			var a = [];
+			ES.ArraySetLength(a, { '[[Writable]]': false });
+			st.deepEqual(
+				getOwnPropertyDescriptor(a, 'length'),
+				{
+					configurable: false,
+					enumerable: false,
+					value: 0,
+					writable: false
+				},
+				'without a value, length becomes nonwritable'
+			);
+			st.end();
+		});
+
+		forEach([-1, Math.pow(2, 32)].concat(v.nonIntegerNumbers), function (nonLength) {
+			t['throws'](
+				function () { ES.ArraySetLength([], { '[[Value]]': nonLength }); },
+				RangeError,
+				'a non-integer, negative, or > (2**31 - 1) is not a valid length: ' + debug(nonLength)
+			);
+		});
+
+		var arr = [];
+		ES.ArraySetLength(arr, { '[[Value]]': 7 });
+		t.equal(arr.length, 7, 'array now has a length of 7');
+
+		t.end();
+	});
+
+	test('ArraySpeciesCreate', function (t) {
+		t.test('errors', function (st) {
+			var testNonNumber = function (nonNumber) {
+				st['throws'](
+					function () { ES.ArraySpeciesCreate([], nonNumber); },
+					TypeError,
+					debug(nonNumber) + ' is not a number'
+				);
+			};
+			forEach(v.nonNumbers, testNonNumber);
+
+			st['throws'](
+				function () { ES.ArraySpeciesCreate([], -1); },
+				TypeError,
+				'-1 is not >= 0'
+			);
+			st['throws'](
+				function () { ES.ArraySpeciesCreate([], -Infinity); },
+				TypeError,
+				'-Infinity is not >= 0'
+			);
+
+			var testNonIntegers = function (nonInteger) {
+				st['throws'](
+					function () { ES.ArraySpeciesCreate([], nonInteger); },
+					TypeError,
+					debug(nonInteger) + ' is not an integer'
+				);
+			};
+			forEach(v.nonIntegerNumbers, testNonIntegers);
+
+			st.end();
+		});
+
+		t.test('works with a non-array', function (st) {
+			forEach(v.objects.concat(v.primitives), function (nonArray) {
+				var arr = ES.ArraySpeciesCreate(nonArray, 0);
+				st.ok(ES.IsArray(arr), 'is an array');
+				st.equal(arr.length, 0, 'length is correct');
+				st.equal(arr.constructor, Array, 'constructor is correct');
+			});
+
+			st.end();
+		});
+
+		t.test('works with a normal array', function (st) {
+			var len = 2;
+			var orig = [1, 2, 3];
+			var arr = ES.ArraySpeciesCreate(orig, len);
+
+			st.ok(ES.IsArray(arr), 'is an array');
+			st.equal(arr.length, len, 'length is correct');
+			st.equal(arr.constructor, orig.constructor, 'constructor is correct');
+
+			st.end();
+		});
+
+		t.test('-0 length produces +0 length', function (st) {
+			var len = -0;
+			st.equal(len, -0, '-0 is negative zero');
+			st.notEqual(len, 0, '-0 is not positive zero');
+
+			var orig = [1, 2, 3];
+			var arr = ES.ArraySpeciesCreate(orig, len);
+
+			st.equal(ES.IsArray(arr), true);
+			st.equal(arr.length, 0);
+			st.equal(arr.constructor, orig.constructor);
+
+			st.end();
+		});
+
+		t.test('works with species construtor', { skip: !hasSpecies }, function (st) {
+			var sentinel = {};
+			var Foo = function Foo(len) {
+				this.length = len;
+				this.sentinel = sentinel;
+			};
+			var Bar = getArraySubclassWithSpeciesConstructor(Foo);
+			var bar = new Bar();
+
+			st.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+			var arr = ES.ArraySpeciesCreate(bar, 3);
+			st.equal(arr.constructor, Foo, 'result used species constructor');
+			st.equal(arr.length, 3, 'length property is correct');
+			st.equal(arr.sentinel, sentinel, 'Foo constructor was exercised');
+
+			st.end();
+		});
+
+		t.test('works with null species constructor', { skip: !hasSpecies }, function (st) {
+			var Bar = getArraySubclassWithSpeciesConstructor(null);
+			var bar = new Bar();
+
+			st.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+			var arr = ES.ArraySpeciesCreate(bar, 3);
+			st.equal(arr.constructor, Array, 'result used default constructor');
+			st.equal(arr.length, 3, 'length property is correct');
+
+			st.end();
+		});
+
+		t.test('works with undefined species constructor', { skip: !hasSpecies }, function (st) {
+			var Bar = getArraySubclassWithSpeciesConstructor();
+			var bar = new Bar();
+
+			st.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+			var arr = ES.ArraySpeciesCreate(bar, 3);
+			st.equal(arr.constructor, Array, 'result used default constructor');
+			st.equal(arr.length, 3, 'length property is correct');
+
+			st.end();
+		});
+
+		t.test('throws with object non-construtor species constructor', { skip: !hasSpecies }, function (st) {
+			forEach(v.objects, function (obj) {
+				var Bar = getArraySubclassWithSpeciesConstructor(obj);
+				var bar = new Bar();
+
+				st.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+				st['throws'](
+					function () { ES.ArraySpeciesCreate(bar, 3); },
+					TypeError,
+					debug(obj) + ' is not a constructor'
+				);
+			});
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('Call', function (t) {
+		var receiver = {};
+		var notFuncs = v.nonFunctions.concat([/a/g, new RegExp('a', 'g')]);
+		t.plan(notFuncs.length + v.nonArrays.length + 5);
+
+		forEach(notFuncs, function (notFunc) {
+			t['throws'](
+				function () { return ES.Call(notFunc, receiver); },
+				TypeError,
+				debug(notFunc) + ' (' + typeof notFunc + ') is not callable'
+			);
+		});
+
+		forEach(v.nonArrays, function (nonArray) {
+			t['throws'](
+				function () { ES.Call(Function.prototype, null, nonArray); },
+				TypeError,
+				debug(nonArray) + ' is not an array'
+			);
+		});
+
+		ES.Call(
+			function (a, b) {
+				t.equal(this, receiver, 'context matches expected');
+				t.deepEqual([a, b], [1, 2], 'named args are correct');
+				t.equal(arguments.length, 3, 'extra argument was passed');
+				t.equal(arguments[2], 3, 'extra argument was correct');
+			},
+			receiver,
+			[1, 2, 3]
+		);
+
+		t.test('Call doesn’t use func.apply', function (st) {
+			st.plan(4);
+
+			var bad = function (a, b) {
+				st.equal(this, receiver, 'context matches expected');
+				st.deepEqual([a, b], [1, 2], 'named args are correct');
+				st.equal(arguments.length, 3, 'extra argument was passed');
+				st.equal(arguments[2], 3, 'extra argument was correct');
+			};
+
+			defineProperty(bad, 'apply', {
+				value: function () {
+					st.fail('bad.apply shouldn’t get called');
+				}
+			});
+
+			ES.Call(bad, receiver, [1, 2, 3]);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('CanonicalNumericIndexString', function (t) {
+		var throwsOnNonString = function (notString) {
+			t['throws'](
+				function () { return ES.CanonicalNumericIndexString(notString); },
+				TypeError,
+				debug(notString) + ' is not a string'
+			);
+		};
+		forEach(v.objects.concat(v.numbers), throwsOnNonString);
+		t.equal(ES.CanonicalNumericIndexString('-0'), -0, '"-0" returns -0');
+		for (var i = -50; i < 50; i += 10) {
+			t.equal(i, ES.CanonicalNumericIndexString(String(i)), '"' + i + '" returns ' + i);
+			t.equal(undefined, ES.CanonicalNumericIndexString(String(i) + 'a'), '"' + i + 'a" returns undefined');
+		}
+		t.end();
+	});
+
+	test('CompletePropertyDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.CompletePropertyDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		var generic = v.genericDescriptor();
+		t.deepEqual(
+			ES.CompletePropertyDescriptor(generic),
+			{
+				'[[Configurable]]': !!generic['[[Configurable]]'],
+				'[[Enumerable]]': !!generic['[[Enumerable]]'],
+				'[[Value]]': undefined,
+				'[[Writable]]': false
+			},
+			'completes a Generic Descriptor'
+		);
+
+		var data = v.dataDescriptor();
+		t.deepEqual(
+			ES.CompletePropertyDescriptor(data),
+			{
+				'[[Configurable]]': !!data['[[Configurable]]'],
+				'[[Enumerable]]': false,
+				'[[Value]]': data['[[Value]]'],
+				'[[Writable]]': !!data['[[Writable]]']
+			},
+			'completes a Data Descriptor'
+		);
+
+		var accessor = v.accessorDescriptor();
+		t.deepEqual(
+			ES.CompletePropertyDescriptor(accessor),
+			{
+				'[[Get]]': accessor['[[Get]]'],
+				'[[Enumerable]]': !!accessor['[[Enumerable]]'],
+				'[[Configurable]]': !!accessor['[[Configurable]]'],
+				'[[Set]]': undefined
+			},
+			'completes an Accessor Descriptor'
+		);
+
+		var mutator = v.mutatorDescriptor();
+		t.deepEqual(
+			ES.CompletePropertyDescriptor(mutator),
+			{
+				'[[Set]]': mutator['[[Set]]'],
+				'[[Enumerable]]': !!mutator['[[Enumerable]]'],
+				'[[Configurable]]': !!mutator['[[Configurable]]'],
+				'[[Get]]': undefined
+			},
+			'completes a mutator Descriptor'
+		);
+
+		t['throws'](
+			function () { ES.CompletePropertyDescriptor(v.bothDescriptor()); },
+			TypeError,
+			'data and accessor descriptors are mutually exclusive'
+		);
+
+		t.end();
+	});
+
+	test('CreateDataProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.CreateDataProperty(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.CreateDataProperty({}, nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a property key'
+			);
+		});
+
+		var sentinel = { id: 'sentinel' };
+		var secondSentinel = { id: 'second sentinel' };
+		forEach(v.propertyKeys, function (propertyKey) {
+			var obj = {};
+			var status = ES.CreateDataProperty(obj, propertyKey, sentinel);
+			t.equal(status, true, 'status is true');
+			t.equal(
+				obj[propertyKey],
+				sentinel,
+				debug(sentinel) + ' is installed on "' + debug(propertyKey) + '" on the object'
+			);
+			var secondStatus = ES.CreateDataProperty(obj, propertyKey, secondSentinel);
+			t.equal(secondStatus, true, 'second status is true');
+			t.equal(
+				obj[propertyKey],
+				secondSentinel,
+				debug(secondSentinel) + ' is installed on "' + debug(propertyKey) + '" on the object'
+			);
+
+			t.test('with defineProperty', { skip: !defineProperty.oDP }, function (st) {
+				var nonWritable = defineProperty({}, propertyKey, { configurable: true, writable: false });
+
+				var nonWritableStatus = ES.CreateDataProperty(nonWritable, propertyKey, sentinel);
+				st.equal(nonWritableStatus, false, 'create data property failed');
+				st.notEqual(
+					nonWritable[propertyKey],
+					sentinel,
+					debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object when key is nonwritable'
+				);
+
+				var nonConfigurable = defineProperty({}, propertyKey, { configurable: false, writable: true });
+
+				var nonConfigurableStatus = ES.CreateDataProperty(nonConfigurable, propertyKey, sentinel);
+				st.equal(nonConfigurableStatus, false, 'create data property failed');
+				st.notEqual(
+					nonConfigurable[propertyKey],
+					sentinel,
+					debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object when key is nonconfigurable'
+				);
+				st.end();
+			});
+		});
+
+		t.end();
+	});
+
+	test('CreateDataPropertyOrThrow', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.CreateDataPropertyOrThrow(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.CreateDataPropertyOrThrow({}, nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a property key'
+			);
+		});
+
+		var sentinel = {};
+		forEach(v.propertyKeys, function (propertyKey) {
+			var obj = {};
+			var status = ES.CreateDataPropertyOrThrow(obj, propertyKey, sentinel);
+			t.equal(status, true, 'status is true');
+			t.equal(
+				obj[propertyKey],
+				sentinel,
+				debug(sentinel) + ' is installed on "' + debug(propertyKey) + '" on the object'
+			);
+
+			if (typeof Object.preventExtensions === 'function') {
+				var notExtensible = {};
+				Object.preventExtensions(notExtensible);
+
+				t['throws'](
+					function () { ES.CreateDataPropertyOrThrow(notExtensible, propertyKey, sentinel); },
+					TypeError,
+					'can not install ' + debug(propertyKey) + ' on non-extensible object'
+				);
+				t.notEqual(
+					notExtensible[propertyKey],
+					sentinel,
+					debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object'
+				);
+			}
+		});
+
+		t.end();
+	});
+
+	test('CreateListFromArrayLike', function (t) {
+		forEach(v.primitives, function (nonObject) {
+			t['throws'](
+				function () { ES.CreateListFromArrayLike(nonObject); },
+				TypeError,
+				debug(nonObject) + ' is not an Object'
+			);
+		});
+		forEach(v.nonArrays, function (nonArray) {
+			t['throws'](
+				function () { ES.CreateListFromArrayLike({}, nonArray); },
+				TypeError,
+				debug(nonArray) + ' is not an Array'
+			);
+		});
+
+		t.deepEqual(
+			ES.CreateListFromArrayLike({ length: 2, 0: 'a', 1: 'b', 2: 'c' }),
+			['a', 'b'],
+			'arraylike stops at the length'
+		);
+
+		t.end();
+	});
+
+	test('CreateHTML', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.CreateHTML('', nonString, '', ''); },
+				TypeError,
+				'tag: ' + debug(nonString) + ' is not a String'
+			);
+			t['throws'](
+				function () { ES.CreateHTML('', '', nonString, ''); },
+				TypeError,
+				'attribute: ' + debug(nonString) + ' is not a String'
+			);
+		});
+
+		t.equal(
+			ES.CreateHTML(
+				{ toString: function () { return 'the string'; } },
+				'some HTML tag!',
+				''
+			),
+			'<some HTML tag!>the string</some HTML tag!>',
+			'works with an empty string attribute value'
+		);
+
+		t.equal(
+			ES.CreateHTML(
+				{ toString: function () { return 'the string'; } },
+				'some HTML tag!',
+				'attr',
+				'value "with quotes"'
+			),
+			'<some HTML tag! attr="value &quot;with quotes&quot;">the string</some HTML tag!>',
+			'works with an attribute, and a value with quotes'
+		);
+
+		t.end();
+	});
+
+	test('CreateMethodProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.CreateMethodProperty(primitive, 'key'); },
+				TypeError,
+				'O must be an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.CreateMethodProperty({}, nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.test('defines correctly', function (st) {
+			var obj = {};
+			var key = 'the key';
+			var value = { foo: 'bar' };
+
+			st.equal(ES.CreateMethodProperty(obj, key, value), true, 'defines property successfully');
+			st.test('property descriptor', { skip: !getOwnPropertyDescriptor }, function (s2t) {
+				s2t.deepEqual(
+					getOwnPropertyDescriptor(obj, key),
+					{
+						configurable: true,
+						enumerable: false,
+						value: value,
+						writable: true
+					},
+					'sets the correct property descriptor'
+				);
+
+				s2t.end();
+			});
+			st.equal(obj[key], value, 'sets the correct value');
+
+			st.end();
+		});
+
+		t.test('fails as expected on a frozen object', { skip: !Object.freeze }, function (st) {
+			var obj = Object.freeze({ foo: 'bar' });
+			st['throws'](
+				function () { ES.CreateMethodProperty(obj, 'foo', { value: 'baz' }); },
+				TypeError,
+				'nonconfigurable key can not be defined'
+			);
+
+			st.end();
+		});
+
+		t.test('fails as expected on a function with a nonconfigurable name', { skip: !functionsHaveNames || functionsHaveConfigurableNames }, function (st) {
+			st['throws'](
+				function () { ES.CreateMethodProperty(function () {}, 'name', { value: 'baz' }); },
+				TypeError,
+				'nonconfigurable function name can not be defined'
+			);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('CreateIterResultObject', function (t) {
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () { ES.CreateIterResultObject({}, nonBoolean); },
+				TypeError,
+				'"done" argument must be a boolean; ' + debug(nonBoolean) + ' is not'
+			);
+		});
+
+		var value = {};
+		t.deepEqual(
+			ES.CreateIterResultObject(value, true),
+			{ value: value, done: true },
+			'creates a "done" iteration result'
+		);
+		t.deepEqual(
+			ES.CreateIterResultObject(value, false),
+			{ value: value, done: false },
+			'creates a "not done" iteration result'
+		);
+
+		t.end();
+	});
+
+	test('DefinePropertyOrThrow', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.DefinePropertyOrThrow(primitive, 'key', {}); },
+				TypeError,
+				'O must be an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.DefinePropertyOrThrow({}, nonPropertyKey, {}); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.test('defines correctly', function (st) {
+			var obj = {};
+			var key = 'the key';
+			var descriptor = {
+				configurable: true,
+				enumerable: false,
+				value: { foo: 'bar' },
+				writable: true
+			};
+
+			st.equal(ES.DefinePropertyOrThrow(obj, key, descriptor), true, 'defines property successfully');
+			st.test('property descriptor', { skip: !getOwnPropertyDescriptor }, function (s2t) {
+				s2t.deepEqual(
+					getOwnPropertyDescriptor(obj, key),
+					descriptor,
+					'sets the correct property descriptor'
+				);
+
+				s2t.end();
+			});
+			st.deepEqual(obj[key], descriptor.value, 'sets the correct value');
+
+			st.end();
+		});
+
+		t.test('fails as expected on a frozen object', { skip: !Object.freeze }, function (st) {
+			var obj = Object.freeze({ foo: 'bar' });
+			st['throws'](
+				function () {
+					ES.DefinePropertyOrThrow(obj, 'foo', { configurable: true, value: 'baz' });
+				},
+				TypeError,
+				'nonconfigurable key can not be defined'
+			);
+
+			st.end();
+		});
+
+		t.test('fails as expected on a function with a nonconfigurable name', { skip: !functionsHaveNames || functionsHaveConfigurableNames }, function (st) {
+			st['throws'](
+				function () {
+					ES.DefinePropertyOrThrow(function () {}, 'name', { configurable: true, value: 'baz' });
+				},
+				TypeError,
+				'nonconfigurable function name can not be defined'
+			);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('DeletePropertyOrThrow', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.DeletePropertyOrThrow(primitive, 'key', {}); },
+				TypeError,
+				'O must be an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.DeletePropertyOrThrow({}, nonPropertyKey, {}); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.test('defines correctly', function (st) {
+			var obj = { 'the key': 42 };
+			var key = 'the key';
+
+			st.equal(ES.DeletePropertyOrThrow(obj, key), true, 'deletes property successfully');
+			st.equal(key in obj, false, 'key is no longer in the object');
+
+			st.end();
+		});
+
+		t.test('fails as expected on a frozen object', { skip: !Object.freeze }, function (st) {
+			var obj = Object.freeze({ foo: 'bar' });
+			st['throws'](
+				function () { ES.DeletePropertyOrThrow(obj, 'foo'); },
+				TypeError,
+				'nonconfigurable key can not be deleted'
+			);
+
+			st.end();
+		});
+
+		t.test('fails as expected on a function with a nonconfigurable name', { skip: !functionsHaveNames || functionsHaveConfigurableNames }, function (st) {
+			st['throws'](
+				function () { ES.DeletePropertyOrThrow(function () {}, 'name'); },
+				TypeError,
+				'nonconfigurable function name can not be deleted'
+			);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('EnumerableOwnNames', function (t) {
+		var obj = testEnumerableOwnNames(t, function (O) { return ES.EnumerableOwnNames(O); });
+
+		t.deepEqual(
+			ES.EnumerableOwnNames(obj),
+			['own'],
+			'returns enumerable own names'
+		);
+
+		t.end();
+	});
+
+	test('FromPropertyDescriptor', function (t) {
+		t.equal(ES.FromPropertyDescriptor(), undefined, 'no value begets undefined');
+		t.equal(ES.FromPropertyDescriptor(undefined), undefined, 'undefined value begets undefined');
+
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			t['throws'](
+				function () { ES.FromPropertyDescriptor(primitive); },
+				TypeError,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		var accessor = v.accessorDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(accessor), {
+			get: accessor['[[Get]]'],
+			enumerable: !!accessor['[[Enumerable]]'],
+			configurable: !!accessor['[[Configurable]]']
+		});
+
+		var mutator = v.mutatorDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(mutator), {
+			set: mutator['[[Set]]'],
+			enumerable: !!mutator['[[Enumerable]]'],
+			configurable: !!mutator['[[Configurable]]']
+		});
+		var data = v.dataDescriptor();
+		t.deepEqual(ES.FromPropertyDescriptor(data), {
+			value: data['[[Value]]'],
+			writable: data['[[Writable]]']
+		});
+
+		t.deepEqual(ES.FromPropertyDescriptor(v.genericDescriptor()), {
+			enumerable: false,
+			configurable: true
+		});
+
+		var both = v.bothDescriptor();
+		t['throws'](
+			function () {
+				ES.FromPropertyDescriptor({ get: both['[[Get]]'], value: both['[[Value]]'] });
+			},
+			TypeError,
+			'data and accessor descriptors are mutually exclusive'
+		);
+
+		t.end();
+	});
+
+	test('Get', function (t) {
+		t['throws'](function () { return ES.Get('a', 'a'); }, TypeError, 'Throws a TypeError if `O` is not an Object');
+		t['throws'](function () { return ES.Get({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+
+		var value = {};
+		t.test('Symbols', { skip: !v.hasSymbols }, function (st) {
+			var sym = Symbol('sym');
+			var obj = {};
+			obj[sym] = value;
+			st.equal(ES.Get(obj, sym), value, 'returns property `P` if it exists on object `O`');
+			st.end();
+		});
+		t.equal(ES.Get({ a: value }, 'a'), value, 'returns property `P` if it exists on object `O`');
+		t.end();
+	});
+
+	test('GetIterator', function (t) {
+		var arr = [1, 2];
+		testIterator(t, ES.GetIterator(arr), arr);
+
+		testIterator(t, ES.GetIterator('abc'), 'abc'.split(''));
+
+		var sentinel = {};
+		forEach(v.primitives, function (nonObject) {
+			var method = function () {
+				return nonObject;
+			};
+			t['throws'](
+				function () { ES.GetIterator(sentinel, method); },
+				TypeError,
+				debug(nonObject) + ' is not an Object; iterator method must return an Object'
+			);
+		});
+
+		var i = 0;
+		var manualMethod = function () {
+			t.equal(this, sentinel, 'receiver is expected object');
+			return {
+				next: function () {
+					var value = arr[i];
+					i += 1;
+					return {
+						done: i > arr.length,
+						value: value // eslint-disable-line no-plusplus
+					};
+				}
+			};
+		};
+		testIterator(t, ES.GetIterator(sentinel, manualMethod), arr);
+
+		t.test('Symbol.iterator', { skip: !v.hasSymbols }, function (st) {
+			var m = new Map();
+			m.set(1, 'a');
+			m.set(2, 'b');
+
+			testIterator(st, ES.GetIterator(m), [[1, 'a'], [2, 'b']]);
+
+			forEach(v.primitives, function (nonObject) {
+				var badIterable = {};
+				badIterable[Symbol.iterator] = function () {
+					return nonObject;
+				};
+				st['throws'](
+					function () { return ES.GetIterator(badIterable); },
+					TypeError,
+					debug(nonObject) + ' is not an Object; iterator method must return an Object'
+				);
+			});
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('GetMethod', function (t) {
+		t['throws'](function () { return ES.GetMethod({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+		t.equal(ES.GetMethod({}, 'a'), undefined, 'returns undefined in property is undefined');
+		t.equal(ES.GetMethod({ a: null }, 'a'), undefined, 'returns undefined if property is null');
+		t.equal(ES.GetMethod({ a: undefined }, 'a'), undefined, 'returns undefined if property is undefined');
+		var obj = { a: function () {} };
+		t['throws'](function () { ES.GetMethod({ a: 'b' }, 'a'); }, TypeError, 'throws TypeError if property exists and is not callable');
+		t.equal(ES.GetMethod(obj, 'a'), obj.a, 'returns property if it is callable');
+		t.end();
+	});
+
+	test('GetOwnPropertyKeys', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.GetOwnPropertyKeys(primitive, 'String'); },
+				TypeError,
+				'O: ' + debug(primitive) + ' is not an Object'
+			);
+		});
+
+		t['throws'](
+			function () { ES.GetOwnPropertyKeys({}, 'not string or symbol'); },
+			TypeError,
+			'Type: must be "String" or "Symbol"'
+		);
+
+		t.test('Symbols', { skip: !v.hasSymbols }, function (st) {
+			var O = { a: 1 };
+			O[Symbol.iterator] = true;
+			var s = Symbol('test');
+			defineProperty(O, s, { enumerable: false, value: true });
+
+			st.deepEqual(
+				ES.GetOwnPropertyKeys(O, 'Symbol'),
+				[Symbol.iterator, s],
+				'works with Symbols, enumerable or not'
+			);
+
+			st.end();
+		});
+
+		t.test('non-enumerable names', { skip: !defineProperty.oDP }, function (st) {
+			var O = { a: 1 };
+			defineProperty(O, 'b', { enumerable: false, value: 2 });
+			if (v.hasSymbols) {
+				O[Symbol.iterator] = true;
+			}
+
+			st.deepEqual(
+				ES.GetOwnPropertyKeys(O, 'String').sort(),
+				['a', 'b'].sort(),
+				'works with Strings, enumerable or not'
+			);
+
+			st.end();
+		});
+
+		t.deepEqual(
+			ES.GetOwnPropertyKeys({ a: 1, b: 2 }, 'String').sort(),
+			['a', 'b'].sort(),
+			'works with enumerable keys'
+		);
+
+		t.end();
+	});
+
+	test('GetPrototypeFromConstructor', function (t) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.GetPrototypeFromConstructor(nonFunction, '%Array%'); },
+				TypeError,
+				debug(nonFunction) + ' is not a constructor'
+			);
+		});
+
+		forEach(arrowFns, function (arrowFn) {
+			t['throws'](
+				function () { ES.GetPrototypeFromConstructor(arrowFn, '%Array%'); },
+				TypeError,
+				debug(arrowFn) + ' is not a constructor'
+			);
+		});
+
+		var f = function () {};
+		t.equal(
+			ES.GetPrototypeFromConstructor(f, '%Array.prototype%'),
+			f.prototype,
+			'function with normal `prototype` property returns it'
+		);
+		forEach([true, 'foo', 42], function (truthyPrimitive) {
+			f.prototype = truthyPrimitive;
+			t.equal(
+				ES.GetPrototypeFromConstructor(f, '%Array.prototype%'),
+				Array.prototype,
+				'function with non-object `prototype` property (' + debug(truthyPrimitive) + ') returns default intrinsic'
+			);
+		});
+
+		t.end();
+	});
+
+	test('GetSubstitution', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.GetSubstitution(nonString, '', 0, [], ''); },
+				TypeError,
+				'`matched`: ' + debug(nonString) + ' is not a String'
+			);
+
+			t['throws'](
+				function () { ES.GetSubstitution('', nonString, 0, [], ''); },
+				TypeError,
+				'`str`: ' + debug(nonString) + ' is not a String'
+			);
+
+			t['throws'](
+				function () { ES.GetSubstitution('', '', 0, [], nonString); },
+				TypeError,
+				'`replacement`: ' + debug(nonString) + ' is not a String'
+			);
+
+			if (canDistinguishSparseFromUndefined || typeof nonString !== 'undefined') {
+				t['throws'](
+					function () { ES.GetSubstitution('', '', 0, [nonString], ''); },
+					TypeError,
+					'`captures`: ' + debug([nonString]) + ' is not an Array of strings'
+				);
+			}
+		});
+
+		forEach(v.notNonNegativeIntegers, function (nonNonNegativeInteger) {
+			t['throws'](
+				function () { ES.GetSubstitution('', '', nonNonNegativeInteger, [], ''); },
+				TypeError,
+				'`position`: ' + debug(nonNonNegativeInteger) + ' is not a non-negative integer'
+			);
+		});
+
+		forEach(v.nonArrays, function (nonArray) {
+			t['throws'](
+				function () { ES.GetSubstitution('', '', 0, nonArray, ''); },
+				TypeError,
+				'`captures`: ' + debug(nonArray) + ' is not an Array'
+			);
+		});
+
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], '123'),
+			'123',
+			'returns the substitution'
+		);
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '$$2$'),
+			'$2$',
+			'supports $$, and trailing $'
+		);
+
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$&<'),
+			'>abcdef<',
+			'supports $&'
+		);
+
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$`<'),
+			'><',
+			'supports $` at position 0'
+		);
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], '>$`<'),
+			'>ab<',
+			'supports $` at position > 0'
+		);
+
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 7, [], ">$'<"),
+			'><',
+			"supports $' at a position where there's less than `matched.length` chars left"
+		);
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], ">$'<"),
+			'>ghi<',
+			"supports $' at a position where there's more than `matched.length` chars left"
+		);
+
+		for (var i = 0; i < 100; i += 1) {
+			var captures = [];
+			captures[i] = 'test';
+			if (i > 0) {
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$' + i + '<'),
+					'>undefined<',
+					'supports $' + i + ' with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$' + i),
+					'>undefined',
+					'supports $' + i + ' at the end of the replacement, with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, '>$' + i + '<'),
+					'><',
+					'supports $' + i + ' with a capture at that index'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, '>$' + i),
+					'>',
+					'supports $' + i + ' at the end of the replacement, with a capture at that index'
+				);
+			}
+			if (i < 10) {
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$0' + i + '<'),
+					i === 0 ? '><' : '>undefined<',
+					'supports $0' + i + ' with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], '>$0' + i),
+					i === 0 ? '>' : '>undefined',
+					'supports $0' + i + ' at the end of the replacement, with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, '>$0' + i + '<'),
+					'><',
+					'supports $0' + i + ' with a capture at that index'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, '>$0' + i),
+					'>',
+					'supports $0' + i + ' at the end of the replacement, with a capture at that index'
+				);
+			}
+		}
+
+		t.end();
+	});
+
+	test('GetV', function (t) {
+		t['throws'](function () { return ES.GetV({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+		var obj = { a: function () {} };
+		t.equal(ES.GetV(obj, 'a'), obj.a, 'returns property if it exists');
+		t.equal(ES.GetV(obj, 'b'), undefined, 'returns undefiend if property does not exist');
+		t.end();
+	});
+
+	test('HasOwnProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.HasOwnProperty(primitive, 'key'); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonKey) {
+			t['throws'](
+				function () { ES.HasOwnProperty({}, nonKey); },
+				TypeError,
+				debug(nonKey) + ' is not a Property Key'
+			);
+		});
+
+		t.equal(ES.HasOwnProperty({}, 'toString'), false, 'inherited properties are not own');
+		t.equal(
+			ES.HasOwnProperty({ toString: 1 }, 'toString'),
+			true,
+			'shadowed inherited own properties are own'
+		);
+		t.equal(ES.HasOwnProperty({ a: 1 }, 'a'), true, 'own properties are own');
+
+		t.end();
+	});
+
+	test('HasProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.HasProperty(primitive, 'key'); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonKey) {
+			t['throws'](
+				function () { ES.HasProperty({}, nonKey); },
+				TypeError,
+				debug(nonKey) + ' is not a Property Key'
+			);
+		});
+
+		t.equal(ES.HasProperty({}, 'nope'), false, 'object does not have nonexistent properties');
+		t.equal(ES.HasProperty({}, 'toString'), true, 'object has inherited properties');
+		t.equal(
+			ES.HasProperty({ toString: 1 }, 'toString'),
+			true,
+			'object has shadowed inherited own properties'
+		);
+		t.equal(ES.HasProperty({ a: 1 }, 'a'), true, 'object has own properties');
+
+		t.end();
+	});
+
+	test('InstanceofOperator', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.InstanceofOperator(primitive, function () {}); },
+				TypeError,
+				debug(primitive) + ' is not an object'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.InstanceofOperator({}, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not callable'
+			);
+		});
+
+		var C = function C() {};
+		var D = function D() {};
+
+		t.equal(ES.InstanceofOperator(new C(), C), true, 'constructor function has an instance of itself');
+		t.equal(ES.InstanceofOperator(new D(), C), false, 'constructor/instance mismatch is false');
+		t.equal(ES.InstanceofOperator(new C(), D), false, 'instance/constructor mismatch is false');
+		t.equal(ES.InstanceofOperator({}, C), false, 'plain object is not an instance of a constructor');
+		t.equal(ES.InstanceofOperator({}, Object), true, 'plain object is an instance of Object');
+
+		t.test('Symbol.hasInstance', { skip: !v.hasSymbols || !Symbol.hasInstance }, function (st) {
+			st.plan(5);
+
+			var O = {};
+			var C2 = function () {};
+			st.equal(ES.InstanceofOperator(O, C2), false, 'O is not an instance of C2');
+
+			defineProperty(C2, Symbol.hasInstance, {
+				configurable: true,
+				value: function (obj) {
+					st.equal(this, C2, 'hasInstance receiver is C2');
+					st.equal(obj, O, 'hasInstance argument is O');
+
+					return {}; // testing coercion to boolean
+				}
+			});
+
+			st.equal(ES.InstanceofOperator(O, C2), true, 'O is now an instance of C2');
+
+			defineProperty(C2, Symbol.hasInstance, {
+				configurable: true,
+				value: undefined
+			});
+
+			st.equal(ES.InstanceofOperator(O, C2), false, 'O is no longer an instance of C2');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('Invoke', function (t) {
+		forEach(v.nonPropertyKeys, function (nonKey) {
+			t['throws'](
+				function () { ES.Invoke({}, nonKey); },
+				TypeError,
+				debug(nonKey) + ' is not a Property Key'
+			);
+		});
+
+		t['throws'](
+			function () { ES.Invoke({ o: false }, 'o'); },
+			TypeError,
+			'fails on a non-function'
+		);
+
+		forEach(v.nonArrays, function (nonArray) {
+			t['throws'](
+				function () { ES.Invoke({}, '', nonArray); },
+				TypeError,
+				debug(nonArray) + ' is not an Array'
+			);
+		});
+
+		t.test('invoked callback', function (st) {
+			var aValue = {};
+			var bValue = {};
+			var obj = {
+				f: function (a) {
+					st.equal(arguments.length, 2, '2 args passed');
+					st.equal(a, aValue, 'first arg is correct');
+					st.equal(arguments[1], bValue, 'second arg is correct');
+				}
+			};
+			st.plan(3);
+			ES.Invoke(obj, 'f', [aValue, bValue]);
+		});
+
+		t.end();
+	});
+
+	test('IsArray', function (t) {
+		t.equal(true, ES.IsArray([]), '[] is array');
+		t.equal(false, ES.IsArray({}), '{} is not array');
+		t.equal(false, ES.IsArray({ length: 1, 0: true }), 'arraylike object is not array');
+		forEach(v.objects.concat(v.primitives), function (value) {
+			t.equal(false, ES.IsArray(value), debug(value) + ' is not array');
+		});
+		t.end();
+	});
+
+	test('IsConcatSpreadable', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t.equal(ES.IsConcatSpreadable(primitive), false, debug(primitive) + ' is not an Object');
+		});
+
+		var hasSymbolConcatSpreadable = v.hasSymbols && Symbol.isConcatSpreadable;
+		t.test('Symbol.isConcatSpreadable', { skip: !hasSymbolConcatSpreadable }, function (st) {
+			forEach(v.falsies, function (falsy) {
+				var obj = {};
+				obj[Symbol.isConcatSpreadable] = falsy;
+				st.equal(
+					ES.IsConcatSpreadable(obj),
+					false,
+					'an object with ' + debug(falsy) + ' as Symbol.isConcatSpreadable is not concat spreadable'
+				);
+			});
+
+			forEach(v.truthies, function (truthy) {
+				var obj = {};
+				obj[Symbol.isConcatSpreadable] = truthy;
+				st.equal(
+					ES.IsConcatSpreadable(obj),
+					true,
+					'an object with ' + debug(truthy) + ' as Symbol.isConcatSpreadable is concat spreadable'
+				);
+			});
+
+			st.end();
+		});
+
+		forEach(v.objects, function (object) {
+			t.equal(
+				ES.IsConcatSpreadable(object),
+				false,
+				'non-array without Symbol.isConcatSpreadable is not concat spreadable'
+			);
+		});
+
+		t.equal(ES.IsConcatSpreadable([]), true, 'arrays are concat spreadable');
+
+		t.end();
+	});
+
+	test('IsConstructor', function (t) {
+		t.equal(true, ES.IsConstructor(function () {}), 'function is constructor');
+		t.equal(false, ES.IsConstructor(/a/g), 'regex is not constructor');
+		forEach(v.objects, function (object) {
+			t.equal(false, ES.IsConstructor(object), object + ' object is not constructor');
+		});
+
+		try {
+			var arrow = Function('return () => {}')(); // eslint-disable-line no-new-func
+			t.equal(ES.IsConstructor(arrow), false, 'arrow function is not constructor');
+		} catch (e) {
+			t.comment('SKIP: arrow function syntax not supported.');
+		}
+
+		try {
+			var foo = Function('return class Foo {}')(); // eslint-disable-line no-new-func
+			t.equal(ES.IsConstructor(foo), true, 'class is constructor');
+		} catch (e) {
+			t.comment('SKIP: class syntax not supported.');
+		}
+
+		if (typeof Reflect !== 'object' || typeof Proxy !== 'function' || has(Proxy, 'prototype')) {
+			t.comment('SKIP: Proxy is constructor');
+		} else {
+			t.equal(ES.IsConstructor(Proxy), true, 'Proxy is constructor');
+		}
+
+		t.end();
+	});
+
+	test('IsExtensible', function (t) {
+		forEach(v.objects, function (object) {
+			t.equal(true, ES.IsExtensible(object), debug(object) + ' object is extensible');
+		});
+		forEach(v.primitives, function (primitive) {
+			t.equal(false, ES.IsExtensible(primitive), debug(primitive) + ' is not extensible');
+		});
+		if (Object.preventExtensions) {
+			t.equal(false, ES.IsExtensible(Object.preventExtensions({})), 'object with extensions prevented is not extensible');
+		}
+		t.end();
+	});
+
+	test('IsPromise', { skip: typeof Promise !== 'function' }, function (t) {
+		forEach(v.objects.concat(v.primitives), function (nonPromise) {
+			t.equal(ES.IsPromise(nonPromise), false, debug(nonPromise) + ' is not a Promise');
+		});
+
+		var thenable = { then: Promise.prototype.then };
+		t.equal(ES.IsPromise(thenable), false, 'generic thenable is not a Promise');
+
+		t.equal(ES.IsPromise(Promise.resolve()), true, 'Promise is a Promise');
+
+		t.end();
+	});
+
+	test('IsPropertyDescriptor', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t.equal(
+				ES.IsPropertyDescriptor(primitive),
+				false,
+				debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		t.equal(ES.IsPropertyDescriptor({ invalid: true }), false, 'invalid keys not allowed on a Property Descriptor');
+
+		t.equal(ES.IsPropertyDescriptor({}), true, 'empty object is an incomplete Property Descriptor');
+
+		t.equal(ES.IsPropertyDescriptor(v.accessorDescriptor()), true, 'accessor descriptor is a Property Descriptor');
+		t.equal(ES.IsPropertyDescriptor(v.mutatorDescriptor()), true, 'mutator descriptor is a Property Descriptor');
+		t.equal(ES.IsPropertyDescriptor(v.dataDescriptor()), true, 'data descriptor is a Property Descriptor');
+		t.equal(ES.IsPropertyDescriptor(v.genericDescriptor()), true, 'generic descriptor is a Property Descriptor');
+
+		t['throws'](
+			function () { ES.IsPropertyDescriptor(v.bothDescriptor()); },
+			TypeError,
+			'a Property Descriptor can not be both a Data and an Accessor Descriptor'
+		);
+
+		t['throws'](
+			function () { ES.IsPropertyDescriptor(v.bothDescriptorWritable()); },
+			TypeError,
+			'a Property Descriptor can not be both a Data and an Accessor Descriptor'
+		);
+
+		t.end();
+	});
+
+	test('IsPropertyKey', function (t) {
+		forEach(v.numbers.concat(v.objects), function (notKey) {
+			t.equal(false, ES.IsPropertyKey(notKey), debug(notKey) + ' is not property key');
+		});
+
+		t.equal(true, ES.IsPropertyKey('foo'), 'string is property key');
+
+		forEach(v.symbols, function (symbol) {
+			t.equal(true, ES.IsPropertyKey(symbol), debug(symbol) + ' is property key');
+		});
+		t.end();
+	});
+
+	test('IsRegExp', function (t) {
+		forEach([/a/g, new RegExp('a', 'g')], function (regex) {
+			t.equal(true, ES.IsRegExp(regex), regex + ' is regex');
+		});
+
+		forEach(v.objects.concat(v.primitives), function (nonRegex) {
+			t.equal(false, ES.IsRegExp(nonRegex), debug(nonRegex) + ' is not regex');
+		});
+
+		t.test('Symbol.match', { skip: !v.hasSymbols || !Symbol.match }, function (st) {
+			var obj = {};
+			obj[Symbol.match] = true;
+			st.equal(true, ES.IsRegExp(obj), 'object with truthy Symbol.match is regex');
+
+			var regex = /a/;
+			defineProperty(regex, Symbol.match, { value: false });
+			st.equal(false, ES.IsRegExp(regex), 'regex with falsy Symbol.match is not regex');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('IsInteger', function (t) {
+		for (var i = -100; i < 100; i += 10) {
+			t.equal(true, ES.IsInteger(i), i + ' is integer');
+			t.equal(false, ES.IsInteger(i + 0.2), (i + 0.2) + ' is not integer');
+		}
+		t.equal(true, ES.IsInteger(-0), '-0 is integer');
+		var notInts = v.nonNumbers.concat(v.nonIntegerNumbers, v.infinities, [NaN, [], new Date()]);
+		forEach(notInts, function (notInt) {
+			t.equal(false, ES.IsInteger(notInt), debug(notInt) + ' is not integer');
+		});
+		t.equal(false, ES.IsInteger(v.uncoercibleObject), 'uncoercibleObject is not integer');
+		t.end();
+	});
+
+	test('IteratorNext', function (t) {
+		forEach(v.primitives, function (nonObject) {
+			t['throws'](
+				function () { ES.IteratorNext(nonObject); },
+				TypeError,
+				debug(nonObject) + ' is not an Object'
+			);
+
+			t['throws'](
+				function () { ES.IteratorNext({ next: function () { return nonObject; } }); },
+				TypeError,
+				'`next()` returns ' + debug(nonObject) + ', which is not an Object'
+			);
+		});
+
+		var iterator = {
+			next: function (value) {
+				return [arguments.length, value];
+			}
+		};
+		t.deepEqual(
+			ES.IteratorNext(iterator),
+			[0, undefined],
+			'returns expected value from `.next()`; `next` receives expected 0 arguments'
+		);
+		t.deepEqual(
+			ES.IteratorNext(iterator, iterator),
+			[1, iterator],
+			'returns expected value from `.next()`; `next` receives expected 1 argument'
+		);
+
+		t.end();
+	});
+
+	test('IteratorComplete', function (t) {
+		forEach(v.primitives, function (nonObject) {
+			t['throws'](
+				function () { ES.IteratorComplete(nonObject); },
+				TypeError,
+				debug(nonObject) + ' is not an Object'
+			);
+		});
+
+		forEach(v.truthies, function (truthy) {
+			t.equal(ES.IteratorComplete({ done: truthy }), true, '{ done: ' + debug(truthy) + ' } is true');
+		});
+
+		forEach(v.falsies, function (falsy) {
+			t.equal(ES.IteratorComplete({ done: falsy }), false, '{ done: ' + debug(falsy) + ' } is false');
+		});
+
+		t.end();
+	});
+
+	test('IteratorValue', function (t) {
+		forEach(v.primitives, function (nonObject) {
+			t['throws'](
+				function () { ES.IteratorValue(nonObject); },
+				TypeError,
+				debug(nonObject) + ' is not an Object'
+			);
+		});
+
+		var sentinel = {};
+		t.equal(ES.IteratorValue({ value: sentinel }), sentinel, 'Gets `.value` off the object');
+
+		t.end();
+	});
+
+	test('IteratorStep', function (t) {
+		t.deepEqual(
+			ES.IteratorStep({
+				next: function () {
+					return {
+						done: false,
+						value: [1, arguments.length]
+					};
+				}
+			}),
+			{ done: false, value: [1, 0] },
+			'not-done iterator result yields iterator result'
+		);
+		t.deepEqual(
+			ES.IteratorStep({
+				next: function () {
+					return {
+						done: true,
+						value: [2, arguments.length]
+					};
+				}
+			}),
+			false,
+			'done iterator result yields false'
+		);
+
+		t.end();
+	});
+
+	test('IteratorClose', function (t) {
+		forEach(v.primitives, function (nonObject) {
+			t['throws'](
+				function () { ES.IteratorClose(nonObject); },
+				TypeError,
+				debug(nonObject) + ' is not an Object'
+			);
+
+			t['throws'](
+				function () { ES.IteratorClose({ 'return': function () { return nonObject; } }, function () {}); },
+				TypeError,
+				'`.return` returns ' + debug(nonObject) + ', which is not an Object'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.IteratorClose({}, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a thunk for a Completion Record'
+			);
+
+			if (nonFunction != null) {
+				t['throws'](
+					function () { ES.IteratorClose({ 'return': nonFunction }, function () {}); },
+					TypeError,
+					'`.return` of ' + debug(nonFunction) + ' is not a Function'
+				);
+			}
+		});
+
+		var sentinel = {};
+		t.equal(
+			ES.IteratorClose({ 'return': undefined }, function () { return sentinel; }),
+			sentinel,
+			'when `.return` is `undefined`, invokes and returns the completion thunk'
+		);
+
+		/* eslint no-throw-literal: 0 */
+		t['throws'](
+			function () { ES.IteratorClose({ 'return': function () { throw sentinel; } }, function () {}); },
+			sentinel,
+			'`.return` that throws, when completionThunk does not, throws exception from `.return`'
+		);
+		t['throws'](
+			function () { ES.IteratorClose({ 'return': function () { throw sentinel; } }, function () { throw -1; }); },
+			-1,
+			'`.return` that throws, when completionThunk does too, throws exception from completionThunk'
+		);
+		t['throws'](
+			function () { ES.IteratorClose({ 'return': function () { } }, function () { throw -1; }); },
+			-1,
+			'`.return` that does not throw, when completionThunk does, throws exception from completionThunk'
+		);
+
+		t.equal(
+			ES.IteratorClose({ 'return': function () { return sentinel; } }, function () { return 42; }),
+			42,
+			'when `.return` and completionThunk do not throw, and `.return` returns an Object, returns completionThunk'
+		);
+
+		t.end();
+	});
+
+	test('ObjectCreate', function (t) {
+		forEach(v.nonNullPrimitives, function (value) {
+			t['throws'](
+				function () { ES.ObjectCreate(value); },
+				TypeError,
+				debug(value) + ' is not null, or an object'
+			);
+		});
+
+		t.test('proto arg', function (st) {
+			var Parent = function Parent() {};
+			Parent.prototype.foo = {};
+			var child = ES.ObjectCreate(Parent.prototype);
+			st.equal(child instanceof Parent, true, 'child is instanceof Parent');
+			st.equal(child.foo, Parent.prototype.foo, 'child inherits properties from Parent.prototype');
+
+			st.end();
+		});
+
+		t.test('internal slots arg', function (st) {
+			st.doesNotThrow(function () { ES.ObjectCreate({}, []); }, 'an empty slot list is valid');
+
+			st['throws'](
+				function () { ES.ObjectCreate({}, ['a']); },
+				SyntaxError,
+				'internal slots are not supported'
+			);
+
+			st.end();
+		});
+
+		t.test('null proto', { skip: !Object.create && !$setProto }, function (st) {
+			st.equal('toString' in {}, true, 'normal objects have toString');
+			st.equal('toString' in ES.ObjectCreate(null), false, 'makes a null object');
+
+			st.end();
+		});
+
+		t.test('null proto when no native Object.create', { skip: Object.create || $setProto }, function (st) {
+			st['throws'](
+				function () { ES.ObjectCreate(null); },
+				SyntaxError,
+				'without a native Object.create, can not create null objects'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('OrdinaryCreateFromConstructor', function (t) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.OrdinaryCreateFromConstructor(nonFunction, '%Array.prototype%'); },
+				TypeError,
+				debug(nonFunction) + ' is not a constructor'
+			);
+		});
+
+		forEach(arrowFns, function (arrowFn) {
+			t['throws'](
+				function () { ES.OrdinaryCreateFromConstructor(arrowFn, '%Array.prototype%'); },
+				TypeError,
+				debug(arrowFn) + ' is not a constructor'
+			);
+		});
+
+		t.test('proto arg', function (st) {
+			var Parent = function Parent() {};
+			Parent.prototype.foo = {};
+			var child = ES.OrdinaryCreateFromConstructor(Parent, '%Array.prototype%');
+			st.equal(child instanceof Parent, true, 'child is instanceof Parent');
+			st.equal(child instanceof Array, false, 'child is not instanceof Array');
+			st.equal(child.foo, Parent.prototype.foo, 'child inherits properties from Parent.prototype');
+
+			st.end();
+		});
+
+		t.test('internal slots arg', function (st) {
+			st.doesNotThrow(
+				function () { ES.OrdinaryCreateFromConstructor(function () {}, '%Array.prototype%', []); },
+				'an empty slot list is valid'
+			);
+
+			st['throws'](
+				function () { ES.OrdinaryCreateFromConstructor(function () {}, '%Array.prototype%', ['a']); },
+				SyntaxError,
+				'internal slots are not supported'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('OrdinaryGetOwnProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.OrdinaryGetOwnProperty(primitive, ''); },
+				TypeError,
+				'O: ' + debug(primitive) + ' is not an Object'
+			);
+		});
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.OrdinaryGetOwnProperty({}, nonPropertyKey); },
+				TypeError,
+				'P: ' + debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.equal(ES.OrdinaryGetOwnProperty({}, 'not in the object'), undefined, 'missing property yields undefined');
+		t.equal(ES.OrdinaryGetOwnProperty({}, 'toString'), undefined, 'inherited non-own property yields undefined');
+
+		t.deepEqual(
+			ES.OrdinaryGetOwnProperty({ a: 1 }, 'a'),
+			ES.ToPropertyDescriptor({
+				configurable: true,
+				enumerable: true,
+				value: 1,
+				writable: true
+			}),
+			'own assigned data property yields expected descriptor'
+		);
+
+		t.deepEqual(
+			ES.OrdinaryGetOwnProperty(/a/, 'lastIndex'),
+			ES.ToPropertyDescriptor({
+				configurable: false,
+				enumerable: false,
+				value: 0,
+				writable: true
+			}),
+			'regex lastIndex yields expected descriptor'
+		);
+
+		t.deepEqual(
+			ES.OrdinaryGetOwnProperty([], 'length'),
+			ES.ToPropertyDescriptor({
+				configurable: false,
+				enumerable: false,
+				value: 0,
+				writable: true
+			}),
+			'array length yields expected descriptor'
+		);
+
+		if (!Object.isFrozen || !Object.isFrozen(Object.prototype)) {
+			t.deepEqual(
+				ES.OrdinaryGetOwnProperty(Object.prototype, 'toString'),
+				ES.ToPropertyDescriptor({
+					configurable: true,
+					enumerable: false,
+					value: Object.prototype.toString,
+					writable: true
+				}),
+				'own non-enumerable data property yields expected descriptor'
+			);
+		}
+
+		t.test('ES5+', { skip: !defineProperty.oDP }, function (st) {
+			var O = {};
+			defineProperty(O, 'foo', {
+				configurable: false,
+				enumerable: false,
+				value: O,
+				writable: true
+			});
+
+			st.deepEqual(
+				ES.OrdinaryGetOwnProperty(O, 'foo'),
+				ES.ToPropertyDescriptor({
+					configurable: false,
+					enumerable: false,
+					value: O,
+					writable: true
+				}),
+				'defined own property yields expected descriptor'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('OrdinaryDefineOwnProperty', { skip: !getOwnPropertyDescriptor }, function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.OrdinaryDefineOwnProperty(primitive, {}, []); },
+				TypeError,
+				'O: ' + debug(primitive) + ' is not an Object'
+			);
+		});
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.OrdinaryDefineOwnProperty({}, nonPropertyKey, v.genericDescriptor()); },
+				TypeError,
+				'P: ' + debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.OrdinaryDefineOwnProperty(primitive, '', v.genericDescriptor()); },
+				TypeError,
+				'Desc: ' + debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		var O = {};
+		var P = 'property key';
+		var Desc = v.accessorDescriptor();
+		t.equal(
+			ES.OrdinaryDefineOwnProperty(O, P, Desc),
+			true,
+			'operation is successful'
+		);
+		t.deepEqual(
+			getOwnPropertyDescriptor(O, P),
+			ES.FromPropertyDescriptor(ES.CompletePropertyDescriptor(Desc)),
+			'expected property descriptor is defined'
+		);
+
+		t.end();
+	});
+
+	test('OrdinaryHasInstance', function (t) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			t.equal(ES.OrdinaryHasInstance(nonFunction, {}), false, debug(nonFunction) + ' is not callable');
+		});
+
+		forEach(v.primitives, function (primitive) {
+			t.equal(ES.OrdinaryHasInstance(function () {}, primitive), false, debug(primitive) + ' is not an object');
+		});
+
+		var C = function C() {};
+		var D = function D() {};
+		t.equal(ES.OrdinaryHasInstance(C, new C()), true, 'constructor function has an instance of itself');
+		t.equal(ES.OrdinaryHasInstance(C, new D()), false, 'constructor/instance mismatch is false');
+		t.equal(ES.OrdinaryHasInstance(D, new C()), false, 'instance/constructor mismatch is false');
+		t.equal(ES.OrdinaryHasInstance(C, {}), false, 'plain object is not an instance of a constructor');
+		t.equal(ES.OrdinaryHasInstance(Object, {}), true, 'plain object is an instance of Object');
+
+		t.end();
+	});
+
+	test('OrdinaryHasProperty', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.OrdinaryHasProperty(primitive, ''); },
+				TypeError,
+				debug(primitive) + ' is not an object'
+			);
+		});
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.OrdinaryHasProperty({}, nonPropertyKey); },
+				TypeError,
+				'P: ' + debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.equal(ES.OrdinaryHasProperty({ a: 1 }, 'a'), true, 'own property is true');
+		t.equal(ES.OrdinaryHasProperty({}, 'toString'), true, 'inherited property is true');
+		t.equal(ES.OrdinaryHasProperty({}, 'nope'), false, 'absent property is false');
+
+		t.end();
+	});
+
+	test('QuoteJSONString', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.QuoteJSONString(nonString); },
+				TypeError,
+				debug(nonString) + ' is not a String'
+			);
+		});
+
+		t.equal(ES.QuoteJSONString(''), '""', '"" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('a'), '"a"', '"a" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('"'), '"\\""', '"\\"" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\b'), '"\\b"', '"\\b" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\t'), '"\\t"', '"\\t" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\n'), '"\\n"', '"\\n" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\f'), '"\\f"', '"\\f" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\r'), '"\\r"', '"\\r" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\\'), '"\\\\"', '"\\\\" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\\'), '"\\\\"', '"\\\\" gets properly JSON-quoted');
+		t.equal(ES.QuoteJSONString('\u0019'), '"\\u0019"', '"\\u0019" gets properly JSON-quoted');
+
+		t.end();
+	});
+
+	test('RegExpCreate', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			if (typeof nonString !== 'symbol') {
+				var p = typeof nonString === 'undefined' ? '' : nonString;
+				t.equal(
+					String(ES.RegExpCreate(p, 'g')),
+					'/' + (String(p) || '(?:)') + '/g',
+					debug(nonString) + ' becomes `/' + String(p) + '/g`'
+				);
+			}
+		});
+
+		t.deepEqual(ES.RegExpCreate(), new RegExp(), 'undefined pattern and flags yields empty regex');
+
+		t.end();
+	});
+
+	test('RegExpExec', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.RegExpExec(primitive); },
+				TypeError,
+				'"R" argument must be an object; ' + debug(primitive) + ' is not'
+			);
+		});
+
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.RegExpExec({}, nonString); },
+				TypeError,
+				'"S" argument must be a String; ' + debug(nonString) + ' is not'
+			);
+		});
+
+		t.test('gets and calls a callable "exec"', function (st) {
+			var str = '123';
+			var o = {
+				exec: function (S) {
+					st.equal(this, o, '"exec" receiver is R');
+					st.equal(S, str, '"exec" argument is S');
+
+					return null;
+				}
+			};
+			st.plan(2);
+			ES.RegExpExec(o, str);
+			st.end();
+		});
+
+		t.test('throws if a callable "exec" returns a non-null non-object', function (st) {
+			var str = '123';
+			st.plan(v.nonNullPrimitives.length);
+			forEach(v.nonNullPrimitives, function (nonNullPrimitive) {
+				st['throws'](
+					function () { ES.RegExpExec({ exec: function () { return nonNullPrimitive; } }, str); },
+					TypeError,
+					'"exec" method must return `null` or an Object; ' + debug(nonNullPrimitive) + ' is not'
+				);
+			});
+			st.end();
+		});
+
+		t.test('actual regex that should match against a string', function (st) {
+			var S = 'aabc';
+			var R = /a/g;
+			var match1 = ES.RegExpExec(R, S);
+			var expected1 = assign(['a'], kludgeMatch(R, { index: 0, input: S }));
+			var match2 = ES.RegExpExec(R, S);
+			var expected2 = assign(['a'], kludgeMatch(R, { index: 1, input: S }));
+			var match3 = ES.RegExpExec(R, S);
+			st.deepEqual(match1, expected1, 'match object 1 is as expected');
+			st.deepEqual(match2, expected2, 'match object 2 is as expected');
+			st.equal(match3, null, 'match 3 is null as expected');
+			st.end();
+		});
+
+		t.test('actual regex that should match against a string, with shadowed "exec"', function (st) {
+			var S = 'aabc';
+			var R = /a/g;
+			defineProperty(R, 'exec', { value: undefined });
+			var match1 = ES.RegExpExec(R, S);
+			var expected1 = assign(['a'], kludgeMatch(R, { index: 0, input: S }));
+			var match2 = ES.RegExpExec(R, S);
+			var expected2 = assign(['a'], kludgeMatch(R, { index: 1, input: S }));
+			var match3 = ES.RegExpExec(R, S);
+			st.deepEqual(match1, expected1, 'match object 1 is as expected');
+			st.deepEqual(match2, expected2, 'match object 2 is as expected');
+			st.equal(match3, null, 'match 3 is null as expected');
+			st.end();
+		});
+		t.end();
+	});
+
+	test('RequireObjectCoercible', function (t) {
+		t.equal(false, 'CheckObjectCoercible' in ES, 'CheckObjectCoercible -> RequireObjectCoercible in ES6');
+		t['throws'](function () { return ES.RequireObjectCoercible(undefined); }, TypeError, 'undefined throws');
+		t['throws'](function () { return ES.RequireObjectCoercible(null); }, TypeError, 'null throws');
+		var isCoercible = function (value) {
+			t.doesNotThrow(function () { return ES.RequireObjectCoercible(value); }, debug(value) + ' does not throw');
+		};
+		forEach(v.objects.concat(v.nonNullPrimitives), isCoercible);
+		t.end();
+	});
+
+	test('SameValueZero', function (t) {
+		t.equal(true, ES.SameValueZero(NaN, NaN), 'NaN is SameValueZero as NaN');
+		t.equal(true, ES.SameValueZero(0, -0), '+0 is SameValueZero as -0');
+		forEach(v.objects.concat(v.primitives), function (val) {
+			t.equal(val === val, ES.SameValueZero(val, val), debug(val) + ' is SameValueZero to itself');
+		});
+		t.end();
+	});
+
+	test('Set', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.Set(primitive, '', null, false); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonKey) {
+			t['throws'](
+				function () { ES.Set({}, nonKey, null, false); },
+				TypeError,
+				debug(nonKey) + ' is not a Property Key'
+			);
+		});
+
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () { ES.Set({}, '', null, nonBoolean); },
+				TypeError,
+				debug(nonBoolean) + ' is not a Boolean'
+			);
+		});
+
+		var o = {};
+		var value = {};
+		ES.Set(o, 'key', value, true);
+		t.deepEqual(o, { key: value }, 'key is set');
+
+		t.test('nonwritable', { skip: !defineProperty.oDP }, function (st) {
+			var obj = { a: value };
+			defineProperty(obj, 'a', { writable: false });
+
+			st['throws'](
+				function () { ES.Set(obj, 'a', {}, true); },
+				TypeError,
+				'can not Set nonwritable property'
+			);
+
+			st.doesNotThrow(
+				function () {
+					st.equal(ES.Set(obj, 'a', {}, false), false, 'unsuccessful Set returns false');
+				},
+				'setting Throw to false prevents an exception'
+			);
+
+			st.end();
+		});
+
+		t.test('nonconfigurable', { skip: !defineProperty.oDP }, function (st) {
+			var obj = { a: value };
+			defineProperty(obj, 'a', { configurable: false });
+
+			st.equal(ES.Set(obj, 'a', value, true), true, 'successful Set returns true');
+			st.deepEqual(obj, { a: value }, 'key is set');
+
+			st.end();
+		});
+
+		t.test('doesn’t call [[Get]] in conforming strict mode environments', { skip: noThrowOnStrictViolation }, function (st) {
+			var getterCalled = false;
+			var setterCalls = 0;
+			var obj = {};
+			defineProperty(obj, 'a', {
+				get: function () {
+					getterCalled = true;
+				},
+				set: function () {
+					setterCalls += 1;
+				}
+			});
+
+			st.equal(ES.Set(obj, 'a', value, false), true, 'successful Set returns true');
+			st.equal(setterCalls, 1, 'setter was called once');
+			st.equal(getterCalled, false, 'getter was not called');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('SetFunctionName', function (t) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.SetFunctionName(nonFunction, ''); },
+				TypeError,
+				debug(nonFunction) + ' is not a Function'
+			);
+		});
+
+		t.test('non-extensible function', { skip: !Object.preventExtensions }, function (st) {
+			var f = getNamelessFunction();
+			Object.preventExtensions(f);
+			st['throws'](
+				function () { ES.SetFunctionName(f, ''); },
+				TypeError,
+				'throws on a non-extensible function'
+			);
+			st.end();
+		});
+
+		t.test('has an own name property', { skip: !functionsHaveNames }, function (st) {
+			st['throws'](
+				function () { ES.SetFunctionName(function g() {}, ''); },
+				TypeError,
+				'throws if function has an own `name` property'
+			);
+			st.end();
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.SetFunctionName(getNamelessFunction(), nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Symbol or String'
+			);
+		});
+
+		t.test('symbols', { skip: !v.hasSymbols || has(getNamelessFunction(), 'name') }, function (st) {
+			var pairs = [
+				[Symbol(), ''],
+				[Symbol(undefined), ''],
+				[Symbol(null), '[null]'],
+				[Symbol(''), getInferredName ? '[]' : ''],
+				[Symbol.iterator, '[Symbol.iterator]'],
+				[Symbol('foo'), '[foo]']
+			];
+			forEach(pairs, function (pair) {
+				var sym = pair[0];
+				var desc = pair[1];
+				var f = getNamelessFunction();
+				ES.SetFunctionName(f, sym);
+				st.equal(f.name, desc, debug(sym) + ' yields a name of ' + debug(desc));
+			});
+
+			st.end();
+		});
+
+		var f = getNamelessFunction();
+		t.test('when names are configurable', { skip: !functionsHaveConfigurableNames || has(f, 'name') }, function (st) {
+			// without prefix
+			st.notEqual(f.name, 'foo', 'precondition');
+			ES.SetFunctionName(f, 'foo');
+			st.equal(f.name, 'foo', 'function name is set without a prefix');
+
+			// with prefix
+			var g = getNamelessFunction();
+			st.notEqual(g.name, 'pre- foo', 'precondition');
+			ES.SetFunctionName(g, 'foo', 'pre-');
+			st.equal(g.name, 'pre- foo', 'function name is set with a prefix');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('SetIntegrityLevel', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.SetIntegrityLevel(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		t['throws'](
+			function () { ES.SetIntegrityLevel({}); },
+			/^TypeError: Assertion failed: `level` must be `"sealed"` or `"frozen"`$/,
+			'`level` must be `"sealed"` or `"frozen"`'
+		);
+
+		var O = { a: 1 };
+		t.test('sealed', { skip: !Object.preventExtensions || noThrowOnStrictViolation }, function (st) {
+			st.equal(ES.SetIntegrityLevel(O, 'sealed'), true);
+			st['throws'](
+				function () { O.b = 2; },
+				/^TypeError: (Cannot|Can't) add property b, object is not extensible$/,
+				'sealing prevent new properties from being added'
+			);
+			O.a = 2;
+			st.equal(O.a, 2, 'pre-frozen, existing properties are mutable');
+			st.end();
+		});
+
+		t.test('frozen', { skip: !Object.freeze || noThrowOnStrictViolation }, function (st) {
+			st.equal(ES.SetIntegrityLevel(O, 'frozen'), true);
+			st['throws'](
+				function () { O.a = 3; },
+				/^TypeError: Cannot assign to read only property 'a' of /,
+				'freezing prevents existing properties from being mutated'
+			);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('SpeciesConstructor', function (t) {
+		t['throws'](function () { ES.SpeciesConstructor(null); }, TypeError);
+		t['throws'](function () { ES.SpeciesConstructor(undefined); }, TypeError);
+
+		var defaultConstructor = function Foo() {};
+
+		t.equal(
+			ES.SpeciesConstructor({ constructor: undefined }, defaultConstructor),
+			defaultConstructor,
+			'undefined constructor returns defaultConstructor'
+		);
+
+		t['throws'](
+			function () { return ES.SpeciesConstructor({ constructor: null }, defaultConstructor); },
+			TypeError,
+			'non-undefined non-object constructor throws'
+		);
+
+		t.test('with Symbol.species', { skip: !hasSpecies }, function (st) {
+			var Bar = function Bar() {};
+			Bar[Symbol.species] = null;
+
+			st.equal(
+				ES.SpeciesConstructor(new Bar(), defaultConstructor),
+				defaultConstructor,
+				'undefined/null Symbol.species returns default constructor'
+			);
+
+			var Baz = function Baz() {};
+			Baz[Symbol.species] = Bar;
+			st.equal(
+				ES.SpeciesConstructor(new Baz(), defaultConstructor),
+				Bar,
+				'returns Symbol.species constructor value'
+			);
+
+			Baz[Symbol.species] = {};
+			st['throws'](
+				function () { ES.SpeciesConstructor(new Baz(), defaultConstructor); },
+				TypeError,
+				'throws when non-constructor non-null non-undefined species value found'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('SplitMatch', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.SplitMatch(nonString, 0, ''); },
+				TypeError,
+				'S: ' + debug(nonString) + ' is not a String'
+			);
+			t['throws'](
+				function () { ES.SplitMatch('', 0, nonString); },
+				TypeError,
+				'R: ' + debug(nonString) + ' is not a String'
+			);
+		});
+
+		forEach(v.nonNumbers.concat(v.nonIntegerNumbers), function (nonIntegerNumber) {
+			t['throws'](
+				function () { ES.SplitMatch('', nonIntegerNumber, ''); },
+				TypeError,
+				'q: ' + debug(nonIntegerNumber) + ' is not an integer'
+			);
+		});
+
+		t.equal(ES.SplitMatch('abc', 0, 'a'), 1, '"a" is found at index 0, before index 1, in "abc"');
+		t.equal(ES.SplitMatch('abc', 1, 'a'), false, '"a" is not found at index 1 in "abc"');
+		t.equal(ES.SplitMatch('abc', 2, 'a'), false, '"a" is not found at index 2 in "abc"');
+
+		t.equal(ES.SplitMatch('abc', 0, 'b'), false, '"a" is not found at index 0 in "abc"');
+		t.equal(ES.SplitMatch('abc', 1, 'b'), 2, '"b" is found at index 1, before index 2, in "abc"');
+		t.equal(ES.SplitMatch('abc', 2, 'b'), false, '"a" is not found at index 2 in "abc"');
+
+		t.equal(ES.SplitMatch('abc', 0, 'c'), false, '"a" is not found at index 0 in "abc"');
+		t.equal(ES.SplitMatch('abc', 1, 'c'), false, '"a" is not found at index 1 in "abc"');
+		t.equal(ES.SplitMatch('abc', 2, 'c'), 3, '"c" is found at index 2, before index 3, in "abc"');
+
+		t.equal(ES.SplitMatch('a', 0, 'ab'), false, 'R longer than S yields false');
+
+		var s = 'a' + wholePoo + 'c';
+		t.equal(ES.SplitMatch(s, 1, wholePoo), 3, debug(wholePoo) + ' is found at index 1, before index 3, in ' + debug(s));
+
+		t.end();
+	});
+
+	test('StringCreate', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.StringCreate(nonString); },
+				TypeError,
+				debug(nonString) + ' is not a String'
+			);
+		});
+
+		t.deepEqual(ES.StringCreate('foo', String.prototype), Object('foo'), '"foo" with `String.prototype` makes `Object("foo")');
+
+		if ($setProto) {
+			var proto = {};
+			t.equal($getProto(ES.StringCreate('', proto)), proto, '[[Prototype]] is set as expected');
+		} else {
+			t['throws'](
+				function () { ES.StringCreate('', proto); },
+				SyntaxError,
+				'setting [[Prototype]] is not supported in this env'
+			);
+		}
+
+		t.equal(ES.StringCreate('a', String.prototype).length, 'a'.length, 'length is preserved');
+
+		t.end();
+	});
+
+	test('StringGetIndexProperty', function (t) {
+		forEach(v.nonStrings.concat(v.strings), function (nonStringObjects) {
+			t['throws'](
+				function () { ES.StringGetIndexProperty(nonStringObjects); },
+				TypeError,
+				debug(nonStringObjects) + ' is not a boxed String Object'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.StringGetIndexProperty('', nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		forEach(v.symbols, function (symbol) {
+			t.equal(
+				ES.StringGetIndexProperty(Object('a'), symbol),
+				undefined,
+				debug(symbol) + ' is a Property Key, but not a String'
+			);
+		});
+
+		// a string where CanonicalNumericIndexString returns undefined, a non-integer, or -0
+		forEach(['-1', '-0', 'undefined'].concat(v.nonIntegerNumbers), function (nonIndex) {
+			var S = Object('abc');
+			t.equal(
+				ES.StringGetIndexProperty(S, String(nonIndex)),
+				undefined,
+				debug(nonIndex) + ' is not an index inside ' + debug(S)
+			);
+		});
+
+		forEach(v.strings, function (str) {
+			var S = Object(str);
+			for (var i = 0; i < str.length; i += 1) {
+				var desc = {
+					'[[Configurable]]': false,
+					'[[Enumerable]]': true,
+					'[[Value]]': str.charAt(i),
+					'[[Writable]]': false
+				};
+				t.deepEqual(
+					ES.StringGetIndexProperty(S, String(i)),
+					desc,
+					'boxed String ' + debug(S) + ' at index ' + debug(i) + ' is ' + debug(desc)
+				);
+			}
+			t.equal(
+				ES.StringGetIndexProperty(S, String(str.length)),
+				undefined,
+				'boxed String ' + debug(S) + ' at OOB index ' + debug(str.length) + ' is `undefined'
+			);
+		});
+
+		t.end();
+	});
+
+	test('SymbolDescriptiveString', function (t) {
+		forEach(v.nonSymbolPrimitives.concat(v.objects), function (nonSymbol) {
+			t['throws'](
+				function () { ES.SymbolDescriptiveString(nonSymbol); },
+				TypeError,
+				debug(nonSymbol) + ' is not a Symbol'
+			);
+		});
+
+		t.test('Symbols', { skip: !v.hasSymbols }, function (st) {
+			st.equal(ES.SymbolDescriptiveString(Symbol()), 'Symbol()', 'undefined description');
+			st.equal(ES.SymbolDescriptiveString(Symbol('')), 'Symbol()', 'empty string description');
+			st.equal(ES.SymbolDescriptiveString(Symbol.iterator), 'Symbol(Symbol.iterator)', 'well-known symbol');
+			st.equal(ES.SymbolDescriptiveString(Symbol('foo')), 'Symbol(foo)', 'string description');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('TestIntegrityLevel', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.TestIntegrityLevel(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		t['throws'](
+			function () { ES.TestIntegrityLevel({ a: 1 }); },
+			/^TypeError: Assertion failed: `level` must be `"sealed"` or `"frozen"`$/,
+			'`level` must be `"sealed"` or `"frozen"`'
+		);
+
+		t.equal(ES.TestIntegrityLevel({ a: 1 }, 'sealed'), false, 'basic object is not sealed');
+		t.equal(ES.TestIntegrityLevel({ a: 1 }, 'frozen'), false, 'basic object is not frozen');
+
+		t.test('preventExtensions', { skip: !Object.preventExtensions }, function (st) {
+			var o = Object.preventExtensions({ a: 1 });
+			st.equal(ES.TestIntegrityLevel(o, 'sealed'), false, 'nonextensible object is not sealed');
+			st.equal(ES.TestIntegrityLevel(o, 'frozen'), false, 'nonextensible object is not frozen');
+
+			var empty = Object.preventExtensions({});
+			st.equal(ES.TestIntegrityLevel(empty, 'sealed'), true, 'empty nonextensible object is sealed');
+			st.equal(ES.TestIntegrityLevel(empty, 'frozen'), true, 'empty nonextensible object is frozen');
+			st.end();
+		});
+
+		t.test('seal', { skip: !Object.seal }, function (st) {
+			var o = Object.seal({ a: 1 });
+			st.equal(ES.TestIntegrityLevel(o, 'sealed'), true, 'sealed object is sealed');
+			st.equal(ES.TestIntegrityLevel(o, 'frozen'), false, 'sealed object is not frozen');
+
+			var empty = Object.seal({});
+			st.equal(ES.TestIntegrityLevel(empty, 'sealed'), true, 'empty sealed object is sealed');
+			st.equal(ES.TestIntegrityLevel(empty, 'frozen'), true, 'empty sealed object is frozen');
+
+			st.end();
+		});
+
+		t.test('freeze', { skip: !Object.freeze }, function (st) {
+			var o = Object.freeze({ a: 1 });
+			st.equal(ES.TestIntegrityLevel(o, 'sealed'), true, 'frozen object is sealed');
+			st.equal(ES.TestIntegrityLevel(o, 'frozen'), true, 'frozen object is frozen');
+
+			var empty = Object.freeze({});
+			st.equal(ES.TestIntegrityLevel(empty, 'sealed'), true, 'empty frozen object is sealed');
+			st.equal(ES.TestIntegrityLevel(empty, 'frozen'), true, 'empty frozen object is frozen');
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('thisNumberValue', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.thisNumberValue(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach(v.numbers, function (number) {
+			t.equal(ES.thisNumberValue(number), number, debug(number) + ' is its own thisNumberValue');
+			var obj = Object(number);
+			t.equal(ES.thisNumberValue(obj), number, debug(obj) + ' is the boxed thisNumberValue');
+		});
+
+		t.end();
+	});
+
+	test('thisBooleanValue', function (t) {
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () { ES.thisBooleanValue(nonBoolean); },
+				TypeError,
+				debug(nonBoolean) + ' is not a Boolean'
+			);
+		});
+
+		forEach(v.booleans, function (boolean) {
+			t.equal(ES.thisBooleanValue(boolean), boolean, debug(boolean) + ' is its own thisBooleanValue');
+			var obj = Object(boolean);
+			t.equal(ES.thisBooleanValue(obj), boolean, debug(obj) + ' is the boxed thisBooleanValue');
+		});
+
+		t.end();
+	});
+
+	test('thisStringValue', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.thisStringValue(nonString); },
+				TypeError,
+				debug(nonString) + ' is not a String'
+			);
+		});
+
+		forEach(v.strings, function (string) {
+			t.equal(ES.thisStringValue(string), string, debug(string) + ' is its own thisStringValue');
+			var obj = Object(string);
+			t.equal(ES.thisStringValue(obj), string, debug(obj) + ' is the boxed thisStringValue');
+		});
+
+		t.end();
+	});
+
+	test('thisTimeValue', function (t) {
+		forEach(v.primitives.concat(v.objects), function (nonDate) {
+			t['throws'](
+				function () { ES.thisTimeValue(nonDate); },
+				TypeError,
+				debug(nonDate) + ' is not a Date'
+			);
+		});
+
+		forEach(v.timestamps, function (timestamp) {
+			var date = new Date(timestamp);
+
+			t.equal(ES.thisTimeValue(date), timestamp, debug(date) + ' is its own thisTimeValue');
+		});
+
+		t.end();
+	});
+
+	test('ToDateString', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.ToDateString(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.ToDateString(NaN), 'Invalid Date', 'NaN becomes "Invalid Date"');
+		var now = +new Date();
+		t.equal(ES.ToDateString(now), Date(now), 'any timestamp becomes `Date(timestamp)`');
+		t.end();
+	});
+
+	test('ToInt16', function (t) {
+		t.equal(0, ES.ToInt16(NaN), 'NaN coerces to +0');
+		forEach([0, Infinity], function (num) {
+			t.equal(0, ES.ToInt16(num), num + ' returns +0');
+			t.equal(0, ES.ToInt16(-num), '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToInt16(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToInt16(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToInt16(0x100000000 - 1), -1, '2^32 - 1 returns -1');
+		t.equal(ES.ToInt16(0x80000000), 0, '2^31 returns +0');
+		t.equal(ES.ToInt16(0x80000000 - 1), -1, '2^31 - 1 returns -1');
+		t.equal(ES.ToInt16(0x10000), 0, '2^16 returns +0');
+		t.equal(ES.ToInt16(0x10000 - 1), -1, '2^16 - 1 returns -1');
+		t.end();
+	});
+
+	test('ToInt8', function (t) {
+		t.equal(0, ES.ToInt8(NaN), 'NaN coerces to +0');
+		forEach([0, Infinity], function (num) {
+			t.equal(0, ES.ToInt8(num), num + ' returns +0');
+			t.equal(0, ES.ToInt8(-num), '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToInt8(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToInt8(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToInt8(0x100000000 - 1), -1, '2^32 - 1 returns -1');
+		t.equal(ES.ToInt8(0x80000000), 0, '2^31 returns +0');
+		t.equal(ES.ToInt8(0x80000000 - 1), -1, '2^31 - 1 returns -1');
+		t.equal(ES.ToInt8(0x10000), 0, '2^16 returns +0');
+		t.equal(ES.ToInt8(0x10000 - 1), -1, '2^16 - 1 returns -1');
+		t.equal(ES.ToInt8(0x100), 0, '2^8 returns +0');
+		t.equal(ES.ToInt8(0x100 - 1), -1, '2^8 - 1 returns -1');
+		t.equal(ES.ToInt8(0x10), 0x10, '2^4 returns 2^4');
+		t.end();
+	});
+
+	test('ToNumber', function (t) {
+		testToNumber(t, ES, ES.ToNumber);
+
+		t.end();
+	});
+
+	test('ToUint8', function (t) {
+		t.equal(0, ES.ToUint8(NaN), 'NaN coerces to +0');
+		forEach([0, Infinity], function (num) {
+			t.equal(0, ES.ToUint8(num), num + ' returns +0');
+			t.equal(0, ES.ToUint8(-num), '-' + num + ' returns +0');
+		});
+		t['throws'](function () { return ES.ToUint8(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.equal(ES.ToUint8(0x100000000), 0, '2^32 returns +0');
+		t.equal(ES.ToUint8(0x100000000 - 1), 0x100 - 1, '2^32 - 1 returns 2^8 - 1');
+		t.equal(ES.ToUint8(0x80000000), 0, '2^31 returns +0');
+		t.equal(ES.ToUint8(0x80000000 - 1), 0x100 - 1, '2^31 - 1 returns 2^8 - 1');
+		t.equal(ES.ToUint8(0x10000), 0, '2^16 returns +0');
+		t.equal(ES.ToUint8(0x10000 - 1), 0x100 - 1, '2^16 - 1 returns 2^8 - 1');
+		t.equal(ES.ToUint8(0x100), 0, '2^8 returns +0');
+		t.equal(ES.ToUint8(0x100 - 1), 0x100 - 1, '2^8 - 1 returns 2^16 - 1');
+		t.equal(ES.ToUint8(0x10), 0x10, '2^4 returns 2^4');
+		t.equal(ES.ToUint8(0x10 - 1), 0x10 - 1, '2^4 - 1 returns 2^4 - 1');
+		t.end();
+	});
+
+	test('ToUint8Clamp', function (t) {
+		t.equal(0, ES.ToUint8Clamp(NaN), 'NaN coerces to +0');
+		t.equal(0, ES.ToUint8Clamp(0), '+0 returns +0');
+		t.equal(0, ES.ToUint8Clamp(-0), '-0 returns +0');
+		t.equal(0, ES.ToUint8Clamp(-Infinity), '-Infinity returns +0');
+		t['throws'](function () { return ES.ToUint8Clamp(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		forEach([255, 256, 0x100000, Infinity], function (number) {
+			t.equal(255, ES.ToUint8Clamp(number), number + ' coerces to 255');
+		});
+		t.equal(1, ES.ToUint8Clamp(1.49), '1.49 coerces to 1');
+		t.equal(2, ES.ToUint8Clamp(1.5), '1.5 coerces to 2, because 2 is even');
+		t.equal(2, ES.ToUint8Clamp(1.51), '1.51 coerces to 2');
+
+		t.equal(2, ES.ToUint8Clamp(2.49), '2.49 coerces to 2');
+		t.equal(2, ES.ToUint8Clamp(2.5), '2.5 coerces to 2, because 2 is even');
+		t.equal(3, ES.ToUint8Clamp(2.51), '2.51 coerces to 3');
+		t.end();
+	});
+
+	test('ToLength', function (t) {
+		t['throws'](function () { return ES.ToLength(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+		t.equal(3, ES.ToLength(v.coercibleObject), 'coercibleObject coerces to 3');
+		t.equal(42, ES.ToLength('42.5'), '"42.5" coerces to 42');
+		t.equal(7, ES.ToLength(7.3), '7.3 coerces to 7');
+		forEach([-0, -1, -42, -Infinity], function (negative) {
+			t.equal(0, ES.ToLength(negative), negative + ' coerces to +0');
+		});
+		t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 1), '2^53 coerces to 2^53 - 1');
+		t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 3), '2^53 + 2 coerces to 2^53 - 1');
+		t.end();
+	});
+
+	test('ToPropertyKey', function (t) {
+		forEach(v.objects.concat(v.nonSymbolPrimitives), function (value) {
+			t.equal(ES.ToPropertyKey(value), String(value), 'ToPropertyKey(value) === String(value) for non-Symbols');
+		});
+
+		forEach(v.symbols, function (symbol) {
+			t.equal(
+				ES.ToPropertyKey(symbol),
+				symbol,
+				'ToPropertyKey(' + debug(symbol) + ') === ' + debug(symbol)
+			);
+			t.equal(
+				ES.ToPropertyKey(Object(symbol)),
+				symbol,
+				'ToPropertyKey(' + debug(Object(symbol)) + ') === ' + debug(symbol)
+			);
+		});
+
+		t.end();
+	});
+
+	test('ToString', function (t) {
+		forEach(v.objects.concat(v.nonSymbolPrimitives), function (item) {
+			t.equal(ES.ToString(item), String(item), 'ES.ToString(' + debug(item) + ') ToStrings to String(' + debug(item) + ')');
+		});
+
+		t['throws'](function () { return ES.ToString(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+
+		forEach(v.symbols, function (symbol) {
+			t['throws'](function () { return ES.ToString(symbol); }, TypeError, debug(symbol) + ' throws');
+		});
+		t.end();
+	});
+
+	test('Type', function (t) {
+		t.equal(ES.Type(), 'Undefined', 'Type() is Undefined');
+		t.equal(ES.Type(undefined), 'Undefined', 'Type(undefined) is Undefined');
+		t.equal(ES.Type(null), 'Null', 'Type(null) is Null');
+		t.equal(ES.Type(true), 'Boolean', 'Type(true) is Boolean');
+		t.equal(ES.Type(false), 'Boolean', 'Type(false) is Boolean');
+		t.equal(ES.Type(0), 'Number', 'Type(0) is Number');
+		t.equal(ES.Type(NaN), 'Number', 'Type(NaN) is Number');
+		t.equal(ES.Type('abc'), 'String', 'Type("abc") is String');
+		t.equal(ES.Type(function () {}), 'Object', 'Type(function () {}) is Object');
+		t.equal(ES.Type({}), 'Object', 'Type({}) is Object');
+
+		t.test('symbols', { skip: !v.hasSymbols }, function (st) {
+			st.equal(ES.Type(Symbol.iterator), 'Symbol', 'Type(Symbol.iterator) is Symbol');
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('ValidateAndApplyPropertyDescriptor', function (t) {
+		forEach(v.nonUndefinedPrimitives, function (nonUndefinedPrimitive) {
+			t['throws'](
+				function () { ES.ValidateAndApplyPropertyDescriptor(nonUndefinedPrimitive, '', false, v.genericDescriptor(), v.genericDescriptor()); },
+				TypeError,
+				'O: ' + debug(nonUndefinedPrimitive) + ' is not undefined or an Object'
+			);
+		});
+
+		forEach(v.nonBooleans, function (nonBoolean) {
+			t['throws'](
+				function () {
+					return ES.ValidateAndApplyPropertyDescriptor(
+						undefined,
+						null,
+						nonBoolean,
+						v.genericDescriptor(),
+						v.genericDescriptor()
+					);
+				},
+				TypeError,
+				'extensible: ' + debug(nonBoolean) + ' is not a Boolean'
+			);
+		});
+
+		forEach(v.primitives, function (primitive) {
+			// Desc must be a Property Descriptor
+			t['throws'](
+				function () {
+					return ES.ValidateAndApplyPropertyDescriptor(
+						undefined,
+						null,
+						false,
+						primitive,
+						v.genericDescriptor()
+					);
+				},
+				TypeError,
+				'Desc: ' + debug(primitive) + ' is not a Property Descriptor'
+			);
+		});
+
+		forEach(v.nonUndefinedPrimitives, function (primitive) {
+			// current must be undefined or a Property Descriptor
+			t['throws'](
+				function () {
+					return ES.ValidateAndApplyPropertyDescriptor(
+						undefined,
+						null,
+						false,
+						v.genericDescriptor(),
+						primitive
+					);
+				},
+				TypeError,
+				'current: ' + debug(primitive) + ' is not a Property Descriptor or undefined'
+			);
+		});
+
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			// if O is an object, P must be a property key
+			t['throws'](
+				function () {
+					return ES.ValidateAndApplyPropertyDescriptor(
+						{},
+						nonPropertyKey,
+						false,
+						v.genericDescriptor(),
+						v.genericDescriptor()
+					);
+				},
+				TypeError,
+				'P: ' + debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.test('current is undefined', function (st) {
+			var propertyKey = 'howdy';
+
+			st.test('generic descriptor', function (s2t) {
+				var generic = v.genericDescriptor();
+				generic['[[Enumerable]]'] = true;
+				var O = {};
+				ES.ValidateAndApplyPropertyDescriptor(undefined, propertyKey, true, generic);
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, false, generic),
+					false,
+					'when extensible is false, nothing happens'
+				);
+				s2t.deepEqual(O, {}, 'no changes applied when O is undefined or extensible is false');
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, true, generic),
+					true,
+					'operation is successful'
+				);
+				var expected = {};
+				expected[propertyKey] = undefined;
+				s2t.deepEqual(O, expected, 'generic descriptor has been defined as an own data property');
+				s2t.end();
+			});
+
+			st.test('data descriptor', function (s2t) {
+				var data = v.dataDescriptor();
+				data['[[Enumerable]]'] = true;
+
+				var O = {};
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(undefined, propertyKey, true, data),
+					true,
+					'noop when O is undefined'
+				);
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, false, data),
+					false,
+					'when extensible is false, nothing happens'
+				);
+				s2t.deepEqual(O, {}, 'no changes applied when O is undefined or extensible is false');
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, true, data),
+					true,
+					'operation is successful'
+				);
+				var expected = {};
+				expected[propertyKey] = data['[[Value]]'];
+				s2t.deepEqual(O, expected, 'data descriptor has been defined as an own data property');
+				s2t.end();
+			});
+
+			st.test('accessor descriptor', { skip: !defineProperty.oDP }, function (s2t) {
+				var count = 0;
+				var accessor = v.accessorDescriptor();
+				accessor['[[Enumerable]]'] = true;
+				accessor['[[Get]]'] = function () {
+					count += 1;
+					return count;
+				};
+
+				var O = {};
+				ES.ValidateAndApplyPropertyDescriptor(undefined, propertyKey, true, accessor);
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, false, accessor),
+					false,
+					'when extensible is false, nothing happens'
+				);
+				s2t.deepEqual(O, {}, 'no changes applied when O is undefined or extensible is false');
+				s2t.equal(
+					ES.ValidateAndApplyPropertyDescriptor(O, propertyKey, true, accessor),
+					true,
+					'operation is successful'
+				);
+				var expected = {};
+				expected[propertyKey] = accessor['[[Get]]']() + 1;
+				s2t.deepEqual(O, expected, 'accessor descriptor has been defined as an own accessor property');
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		t.test('every field in Desc is absent', { skip: 'it is unclear if having no fields qualifies Desc to be a Property Descriptor' });
+
+		forEach([v.dataDescriptor, v.accessorDescriptor, v.mutatorDescriptor], function (getDescriptor) {
+			t.equal(
+				ES.ValidateAndApplyPropertyDescriptor(undefined, 'property key', true, getDescriptor(), getDescriptor()),
+				true,
+				'when Desc and current are the same, early return true'
+			);
+		});
+
+		t.test('current is nonconfigurable', function (st) {
+			// note: these must not be generic descriptors, or else the algorithm returns an early true
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.configurable(v.dataDescriptor()),
+					v.descriptors.nonConfigurable(v.dataDescriptor())
+				),
+				false,
+				'false if Desc is configurable'
+			);
+
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.enumerable(v.dataDescriptor()),
+					v.descriptors.nonEnumerable(v.dataDescriptor())
+				),
+				false,
+				'false if Desc is Enumerable and current is not'
+			);
+
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.nonEnumerable(v.dataDescriptor()),
+					v.descriptors.enumerable(v.dataDescriptor())
+				),
+				false,
+				'false if Desc is not Enumerable and current is'
+			);
+
+			var descLackingEnumerable = v.accessorDescriptor();
+			delete descLackingEnumerable['[[Enumerable]]'];
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					descLackingEnumerable,
+					v.descriptors.enumerable(v.accessorDescriptor())
+				),
+				true,
+				'not false if Desc lacks Enumerable'
+			);
+
+			st.end();
+		});
+
+		t.test('Desc and current: one is a data descriptor, one is not', { skip: !defineProperty || !getOwnPropertyDescriptor }, function (st) {
+			// note: Desc must be configurable if current is nonconfigurable, to hit this branch
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.configurable(v.accessorDescriptor()),
+					v.descriptors.nonConfigurable(v.dataDescriptor())
+				),
+				false,
+				'false if current (data) is nonconfigurable'
+			);
+
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.configurable(v.dataDescriptor()),
+					v.descriptors.nonConfigurable(v.accessorDescriptor())
+				),
+				false,
+				'false if current (not data) is nonconfigurable'
+			);
+
+			// one is data and one is not,
+			//	// if current is data, convert to accessor
+			//	// else convert to data
+
+			var startsWithData = {
+				'property key': 42
+			};
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					startsWithData,
+					'property key',
+					true,
+					v.descriptors.enumerable(v.descriptors.configurable(v.accessorDescriptor())),
+					v.descriptors.enumerable(v.descriptors.configurable(v.dataDescriptor()))
+				),
+				true,
+				'operation is successful: current is data, Desc is accessor'
+			);
+			var shouldBeAccessor = getOwnPropertyDescriptor(startsWithData, 'property key');
+			st.equal(typeof shouldBeAccessor.get, 'function', 'has a getter');
+
+			var key = 'property key';
+			var startsWithAccessor = {};
+			defineProperty(startsWithAccessor, key, {
+				configurable: true,
+				enumerable: true,
+				get: function get() { return 42; }
+			});
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					startsWithAccessor,
+					key,
+					true,
+					v.descriptors.enumerable(v.descriptors.configurable(v.dataDescriptor())),
+					v.descriptors.enumerable(v.descriptors.configurable(v.accessorDescriptor(42)))
+				),
+				true,
+				'operation is successful: current is accessor, Desc is data'
+			);
+			var shouldBeData = getOwnPropertyDescriptor(startsWithAccessor, 'property key');
+			st.deepEqual(shouldBeData, { configurable: true, enumerable: true, value: 42, writable: false }, 'is a data property');
+
+			st.end();
+		});
+
+		t.test('Desc and current are both data descriptors', function (st) {
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.writable(v.dataDescriptor()),
+					v.descriptors.nonWritable(v.descriptors.nonConfigurable(v.dataDescriptor()))
+				),
+				false,
+				'false if frozen current and writable Desc'
+			);
+
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.descriptors.configurable({ '[[Value]]': 42 }),
+					v.descriptors.nonWritable({ '[[Value]]': 7 })
+				),
+				false,
+				'false if nonwritable current has a different value than Desc'
+			);
+
+			st.end();
+		});
+
+		t.test('current is nonconfigurable; Desc and current are both accessor descriptors', function (st) {
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.mutatorDescriptor(),
+					v.descriptors.nonConfigurable(v.mutatorDescriptor())
+				),
+				false,
+				'false if both Sets are not equal'
+			);
+
+			st.equal(
+				ES.ValidateAndApplyPropertyDescriptor(
+					undefined,
+					'property key',
+					true,
+					v.accessorDescriptor(),
+					v.descriptors.nonConfigurable(v.accessorDescriptor())
+				),
+				false,
+				'false if both Gets are not equal'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+};
+
+var es2016 = function ES2016(ES, ops, expectedMissing, skips) {
+	es2015(ES, ops, expectedMissing, assign(assign({}, skips), {
+		StringGetIndexProperty: true
+	}));
+	var test = makeTest(skips);
+
+	test('IterableToArrayLike', function (t) {
+		t.test('custom iterables', { skip: !v.hasSymbols }, function (st) {
+			var O = {};
+			O[Symbol.iterator] = function () {
+				var i = -1;
+				return {
+					next: function () {
+						i += 1;
+						return {
+							done: i >= 5,
+							value: i
+						};
+					}
+				};
+			};
+			st.deepEqual(
+				ES.IterableToArrayLike(O),
+				[0, 1, 2, 3, 4],
+				'Symbol.iterator method is called and values collected'
+			);
+
+			st.end();
+		});
+
+		t.deepEqual(ES.IterableToArrayLike('abc'), ['a', 'b', 'c'], 'a string of code units spreads');
+		t.deepEqual(ES.IterableToArrayLike('💩'), ['💩'], 'a string of code points spreads');
+		t.deepEqual(ES.IterableToArrayLike('a💩c'), ['a', '💩', 'c'], 'a string of code points and units spreads');
+
+		var arr = [1, 2, 3];
+		t.deepEqual(ES.IterableToArrayLike(arr), arr, 'an array becomes a similar array');
+		t.notEqual(ES.IterableToArrayLike(arr), arr, 'an array becomes a different, but similar, array');
+
+		var O = {};
+		t.equal(ES.IterableToArrayLike(O), O, 'a non-iterable non-array non-string object is returned directly');
+
+		t.end();
+	});
+
+	test('OrdinaryGetPrototypeOf', function (t) {
+		t.test('values', { skip: !$getProto }, function (st) {
+			st.equal(ES.OrdinaryGetPrototypeOf([]), Array.prototype, 'array [[Prototype]] is Array.prototype');
+			st.equal(ES.OrdinaryGetPrototypeOf({}), Object.prototype, 'object [[Prototype]] is Object.prototype');
+			st.equal(ES.OrdinaryGetPrototypeOf(/a/g), RegExp.prototype, 'regex [[Prototype]] is RegExp.prototype');
+			st.equal(ES.OrdinaryGetPrototypeOf(Object('')), String.prototype, 'boxed string [[Prototype]] is String.prototype');
+			st.equal(ES.OrdinaryGetPrototypeOf(Object(42)), Number.prototype, 'boxed number [[Prototype]] is Number.prototype');
+			st.equal(ES.OrdinaryGetPrototypeOf(Object(true)), Boolean.prototype, 'boxed boolean [[Prototype]] is Boolean.prototype');
+			if (v.hasSymbols) {
+				st.equal(ES.OrdinaryGetPrototypeOf(Object(Symbol.iterator)), Symbol.prototype, 'boxed symbol [[Prototype]] is Symbol.prototype');
+			}
+			st.end();
+		});
+
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.OrdinaryGetPrototypeOf(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+		t.end();
+	});
+
+	test('OrdinarySetPrototypeOf', { skip: !$getProto || !$setProto }, function (t) {
+		var a = [];
+		var proto = {};
+
+		t.equal(ES.OrdinaryGetPrototypeOf(a), Array.prototype, 'precondition');
+		t.equal(ES.OrdinarySetPrototypeOf(a, proto), true, 'setting prototype is successful');
+		t.equal(ES.OrdinaryGetPrototypeOf(a), proto, 'postcondition');
+
+		t.end();
+	});
+
+	test('SameValueNonNumber', function (t) {
+		var willThrow = [
+			[3, 4],
+			[NaN, 4],
+			[4, ''],
+			['abc', true],
+			[{}, false]
+		];
+		forEach(willThrow, function (nums) {
+			t['throws'](function () { return ES.SameValueNonNumber.apply(ES, nums); }, TypeError, 'value must be same type and non-number');
+		});
+
+		forEach(v.objects.concat(v.nonNumberPrimitives), function (val) {
+			t.equal(val === val, ES.SameValueNonNumber(val, val), debug(val) + ' is SameValueNonNumber to itself');
+		});
+
+		t.end();
+	});
+
+	test('UTF16Encoding', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.UTF16Encoding(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t['throws'](
+			function () { ES.UTF16Encoding(-1); },
+			TypeError,
+			'-1 is < 0'
+		);
+
+		t['throws'](
+			function () { ES.UTF16Encoding(0x10FFFF + 1); },
+			TypeError,
+			'0x10FFFF + 1 is > 0x10FFFF'
+		);
+
+		t.equal(ES.UTF16Encoding(0xD83D), leadingPoo, '0xD83D is the first half of ' + wholePoo);
+		t.equal(ES.UTF16Encoding(0xDCA9), trailingPoo, '0xDCA9 is the last half of ' + wholePoo);
+		t.equal(ES.UTF16Encoding(0x1F4A9), wholePoo, '0xDCA9 is the last half of ' + wholePoo);
+
+		t.end();
+	});
+
+	test('UTF16Decode', function (t) {
+		t['throws'](
+			function () { ES.UTF16Decode('a'.charCodeAt(0), trailingPoo.charCodeAt(0)); },
+			TypeError,
+			'"a" is not a leading surrogate'
+		);
+		t['throws'](
+			function () { ES.UTF16Decode(leadingPoo.charCodeAt(0), 'b'.charCodeAt(0)); },
+			TypeError,
+			'"b" is not a trailing surrogate'
+		);
+
+		t.equal(ES.UTF16Decode(leadingPoo.charCodeAt(0), trailingPoo.charCodeAt(0)), wholePoo);
+
+		t.end();
+	});
+};
+
+var es2017 = function ES2017(ES, ops, expectedMissing, skips) {
+	es2016(ES, ops, expectedMissing, assign({}, skips, {
+		EnumerableOwnNames: true,
+		IterableToArrayLike: true
+	}));
+	var test = makeTest(skips);
+
+	test('EnumerableOwnProperties', function (t) {
+		var obj = testEnumerableOwnNames(t, function (O) {
+			return ES.EnumerableOwnProperties(O, 'key');
+		});
+
+		t.deepEqual(
+			ES.EnumerableOwnProperties(obj, 'value'),
+			[obj.own],
+			'returns enumerable own values'
+		);
+
+		t.deepEqual(
+			ES.EnumerableOwnProperties(obj, 'key+value'),
+			[['own', obj.own]],
+			'returns enumerable own entries'
+		);
+
+		t.end();
+	});
+
+	test('IterableToList', function (t) {
+		var customIterator = function () {
+			var i = -1;
+			return {
+				next: function () {
+					i += 1;
+					return {
+						done: i >= 5,
+						value: i
+					};
+				}
+			};
+		};
+
+		t.deepEqual(
+			ES.IterableToList({}, customIterator),
+			[0, 1, 2, 3, 4],
+			'iterator method is called and values collected'
+		);
+
+		t.test('Symbol support', { skip: !v.hasSymbols }, function (st) {
+			st.deepEqual(ES.IterableToList('abc', String.prototype[Symbol.iterator]), ['a', 'b', 'c'], 'a string of code units spreads');
+			st.deepEqual(ES.IterableToList('☃', String.prototype[Symbol.iterator]), ['☃'], 'a string of code points spreads');
+
+			var arr = [1, 2, 3];
+			st.deepEqual(ES.IterableToList(arr, arr[Symbol.iterator]), arr, 'an array becomes a similar array');
+			st.notEqual(ES.IterableToList(arr, arr[Symbol.iterator]), arr, 'an array becomes a different, but similar, array');
+
+			st.end();
+		});
+
+		t['throws'](
+			function () { ES.IterableToList({}, void 0); },
+			TypeError,
+			'non-function iterator method'
+		);
+
+		t.end();
+	});
+
+	test('StringGetOwnProperty', function (t) {
+		forEach(v.nonStrings.concat(v.strings), function (nonBoxedString) {
+			t['throws'](
+				function () { ES.StringGetOwnProperty(nonBoxedString, '0'); },
+				TypeError,
+				debug(nonBoxedString) + ' is not a boxed String'
+			);
+		});
+		forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+			t['throws'](
+				function () { ES.StringGetOwnProperty(Object(''), nonPropertyKey); },
+				TypeError,
+				debug(nonPropertyKey) + ' is not a Property Key'
+			);
+		});
+
+		t.equal(ES.StringGetOwnProperty(Object(''), '0'), undefined, 'empty boxed string yields undefined');
+
+		forEach(v.strings, function (string) {
+			if (string) {
+				var S = Object(string);
+				for (var i = 0; i < string.length; i += 1) {
+					var descriptor = ES.StringGetOwnProperty(S, String(i));
+					t.deepEqual(
+						descriptor,
+						{
+							'[[Configurable]]': false,
+							'[[Enumerable]]': true,
+							'[[Value]]': string.charAt(i),
+							'[[Writable]]': false
+						},
+						debug(string) + ': property ' + debug(String(i)) + ': returns expected descriptor'
+					);
+				}
+			}
+		});
+
+		t.end();
+	});
+
+	test('ToIndex', function (t) {
+		t.equal(ES.ToIndex(), 0, 'no value gives +0');
+		t.equal(ES.ToIndex(undefined), 0, 'undefined value gives +0');
+		t.equal(ES.ToIndex(-0), 0, '-0 gives +0');
+
+		t['throws'](function () { ES.ToIndex(-1); }, RangeError, 'negative numbers throw');
+
+		t['throws'](function () { ES.ToIndex(MAX_SAFE_INTEGER + 1); }, RangeError, 'too large numbers throw');
+
+		t.equal(ES.ToIndex(3), 3, 'numbers work');
+		t.equal(ES.ToIndex(v.valueOfOnlyObject), 4, 'coercible objects are coerced');
+
+		t.end();
+	});
+};
+
+var es2018 = function ES2018(ES, ops, expectedMissing, skips) {
+	es2017(ES, ops, expectedMissing, assign({}, skips, {
+		EnumerableOwnProperties: true,
+		GetSubstitution: true,
+		IsPropertyDescriptor: true
+	}));
+	var test = makeTest(skips);
+
+	test('CopyDataProperties', function (t) {
+		t.test('first argument: target', function (st) {
+			forEach(v.primitives, function (primitive) {
+				st['throws'](
+					function () { ES.CopyDataProperties(primitive, {}, []); },
+					TypeError,
+					debug(primitive) + ' is not an Object'
+				);
+			});
+			st.end();
+		});
+
+		t.test('second argument: source', function (st) {
+			var frozenTarget = Object.freeze ? Object.freeze({}) : {};
+			forEach(v.nullPrimitives, function (nullish) {
+				st.equal(
+					ES.CopyDataProperties(frozenTarget, nullish, []),
+					frozenTarget,
+					debug(nullish) + ' "source" yields identical, unmodified target'
+				);
+			});
+
+			forEach(v.nonNullPrimitives, function (objectCoercible) {
+				var target = {};
+				var result = ES.CopyDataProperties(target, objectCoercible, []);
+				st.equal(result, target, 'result === target');
+				st.deepEqual(keys(result), keys(Object(objectCoercible)), 'target ends up with keys of ' + debug(objectCoercible));
+			});
+
+			st.test('enumerable accessor property', { skip: !defineProperty.oDP }, function (s2t) {
+				var target = {};
+				var source = {};
+				defineProperty(source, 'a', {
+					enumerable: true,
+					get: function () { return 42; }
+				});
+				var result = ES.CopyDataProperties(target, source, []);
+				s2t.equal(result, target, 'result === target');
+				s2t.deepEqual(result, { a: 42 }, 'target ends up with enumerable accessor of source');
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		t.test('third argument: excludedItems', function (st) {
+			forEach(v.objects.concat(v.primitives), function (nonArray) {
+				st['throws'](
+					function () { ES.CopyDataProperties({}, {}, nonArray); },
+					TypeError,
+					debug(nonArray) + ' is not an Array'
+				);
+			});
+
+			forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+				st['throws'](
+					function () { ES.CopyDataProperties({}, {}, [nonPropertyKey]); },
+					TypeError,
+					debug(nonPropertyKey) + ' is not a Property Key'
+				);
+			});
+
+			var result = ES.CopyDataProperties({}, { a: 1, b: 2, c: 3 }, ['b']);
+			st.deepEqual(keys(result).sort(), ['a', 'c'].sort(), 'excluded string keys are excluded');
+
+			st.test('excluding symbols', { skip: !v.hasSymbols }, function (s2t) {
+				var source = {};
+				forEach(v.symbols, function (symbol) {
+					source[symbol] = true;
+				});
+
+				var includedSymbols = v.symbols.slice(1);
+				var excludedSymbols = v.symbols.slice(0, 1);
+				var target = ES.CopyDataProperties({}, source, excludedSymbols);
+
+				forEach(includedSymbols, function (symbol) {
+					s2t.equal(has(target, symbol), true, debug(symbol) + ' is included');
+				});
+
+				forEach(excludedSymbols, function (symbol) {
+					s2t.equal(has(target, symbol), false, debug(symbol) + ' is excluded');
+				});
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		// TODO: CopyDataProperties does not throw when copying fails
+
+		t.end();
+	});
+
+	test('DateString', function (t) {
+		forEach(v.nonNumbers.concat(NaN), function (nonNumberOrNaN) {
+			t['throws'](
+				function () { ES.DateString(nonNumberOrNaN); },
+				TypeError,
+				debug(nonNumberOrNaN) + ' is not a non-NaN Number'
+			);
+		});
+
+		t.equal(ES.DateString(Date.UTC(2019, 8, 10, 7, 8, 9)), 'Tue Sep 10 2019');
+		t.equal(ES.DateString(Date.UTC(2016, 1, 29, 7, 8, 9)), 'Mon Feb 29 2016'); // leap day
+		t.end();
+	});
+
+	test('EnumerableOwnPropertyNames', function (t) {
+		var obj = testEnumerableOwnNames(t, function (O) {
+			return ES.EnumerableOwnPropertyNames(O, 'key');
+		});
+
+		t.deepEqual(
+			ES.EnumerableOwnPropertyNames(obj, 'value'),
+			[obj.own],
+			'returns enumerable own values'
+		);
+
+		t.deepEqual(
+			ES.EnumerableOwnPropertyNames(obj, 'key+value'),
+			[['own', obj.own]],
+			'returns enumerable own entries'
+		);
+
+		t.end();
+	});
+
+	test('GetSubstitution', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.GetSubstitution(nonString, '', 0, [], undefined, ''); },
+				TypeError,
+				'`matched`: ' + debug(nonString) + ' is not a String'
+			);
+
+			t['throws'](
+				function () { ES.GetSubstitution('', nonString, 0, [], undefined, ''); },
+				TypeError,
+				'`str`: ' + debug(nonString) + ' is not a String'
+			);
+
+			t['throws'](
+				function () { ES.GetSubstitution('', '', 0, [], undefined, nonString); },
+				TypeError,
+				'`replacement`: ' + debug(nonString) + ' is not a String'
+			);
+
+			t['throws'](
+				function () { ES.GetSubstitution('', '', 0, [nonString], undefined, ''); },
+				TypeError,
+				'`captures`: ' + debug([nonString]) + ' is not an Array of strings'
+			);
+		});
+
+		forEach(v.notNonNegativeIntegers, function (nonNonNegativeInteger) {
+			t['throws'](
+				function () { ES.GetSubstitution('', '', nonNonNegativeInteger, [], undefined, ''); },
+				TypeError,
+				'`position`: ' + debug(nonNonNegativeInteger) + ' is not a non-negative integer'
+			);
+		});
+
+		forEach(v.nonArrays, function (nonArray) {
+			t['throws'](
+				function () { ES.GetSubstitution('', '', 0, nonArray, undefined, ''); },
+				TypeError,
+				'`captures`: ' + debug(nonArray) + ' is not an Array'
+			);
+		});
+
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], undefined, '123'),
+			'123',
+			'returns the substitution'
+		);
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '$$2$'),
+			'$2$',
+			'supports $$, and trailing $'
+		);
+
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$&<'),
+			'>abcdef<',
+			'supports $&'
+		);
+
+		t.equal(
+			ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$`<'),
+			'><',
+			'supports $` at position 0'
+		);
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], undefined, '>$`<'),
+			'>ab<',
+			'supports $` at position > 0'
+		);
+
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 7, [], undefined, ">$'<"),
+			'><',
+			"supports $' at a position where there's less than `matched.length` chars left"
+		);
+		t.equal(
+			ES.GetSubstitution('def', 'abcdefghi', 3, [], undefined, ">$'<"),
+			'>ghi<',
+			"supports $' at a position where there's more than `matched.length` chars left"
+		);
+
+		for (var i = 0; i < 100; i += 1) {
+			var captures = [];
+			captures[i] = 'test';
+			if (i > 0) {
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$' + i + '<'),
+					'>undefined<',
+					'supports $' + i + ' with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$' + i),
+					'>undefined',
+					'supports $' + i + ' at the end of the replacement, with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, undefined, '>$' + i + '<'),
+					'><',
+					'supports $' + i + ' with a capture at that index'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, undefined, '>$' + i),
+					'>',
+					'supports $' + i + ' at the end of the replacement, with a capture at that index'
+				);
+			}
+			if (i < 10) {
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$0' + i + '<'),
+					i === 0 ? '><' : '>undefined<',
+					'supports $0' + i + ' with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, [], undefined, '>$0' + i),
+					i === 0 ? '>' : '>undefined',
+					'supports $0' + i + ' at the end of the replacement, with no captures'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, undefined, '>$0' + i + '<'),
+					'><',
+					'supports $0' + i + ' with a capture at that index'
+				);
+				t.equal(
+					ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, undefined, '>$0' + i),
+					'>',
+					'supports $0' + i + ' at the end of the replacement, with a capture at that index'
+				);
+			}
+		}
+
+		t.test('named captures', function (st) {
+			var namedCaptures = {
+				foo: 'foo!'
+			};
+
+			st.equal(
+				ES.GetSubstitution('abcdef', 'abcdefghi', 0, captures, namedCaptures, 'a>$<foo><z'),
+				'a>foo!<z',
+				'supports named captures'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('IsStringPrefix', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.IsStringPrefix(nonString, 'a'); },
+				TypeError,
+				'first arg: ' + debug(nonString) + ' is not a string'
+			);
+			t['throws'](
+				function () { ES.IsStringPrefix('a', nonString); },
+				TypeError,
+				'second arg: ' + debug(nonString) + ' is not a string'
+			);
+		});
+
+		forEach(v.strings, function (string) {
+			t.equal(ES.IsStringPrefix(string, string), true, debug(string) + ' is a prefix of itself');
+
+			t.equal(ES.IsStringPrefix('', string), true, 'the empty string is a prefix of everything');
+		});
+
+		t.equal(ES.IsStringPrefix('abc', 'abcd'), true, '"abc" is a prefix of "abcd"');
+		t.equal(ES.IsStringPrefix('abcd', 'abc'), false, '"abcd" is not a prefix of "abc"');
+
+		t.equal(ES.IsStringPrefix('a', 'bc'), false, '"a" is not a prefix of "bc"');
+
+		t.end();
+	});
+
+	test('NumberToString', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.NumberToString(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach(v.numbers, function (number) {
+			t.equal(ES.NumberToString(number), String(number), debug(number) + ' stringifies to ' + number);
+		});
+
+		t.end();
+	});
+
+	test('PromiseResolve', function (t) {
+		t.test('Promises unsupported', { skip: typeof Promise === 'function' }, function (st) {
+			st['throws'](
+				function () { ES.PromiseResolve(); },
+				SyntaxError,
+				'Promises are not supported'
+			);
+			st.end();
+		});
+
+		t.test('Promises supported', { skip: typeof Promise !== 'function' }, function (st) {
+			st.plan(2);
+
+			var a = {};
+			var b = {};
+			var fulfilled = Promise.resolve(a);
+			var rejected = Promise.reject(b);
+
+			ES.PromiseResolve(Promise, fulfilled).then(function (x) {
+				st.equal(x, a, 'fulfilled promise resolves to fulfilled');
+			});
+
+			ES.PromiseResolve(Promise, rejected)['catch'](function (e) {
+				st.equal(e, b, 'rejected promise resolves to rejected');
+			});
+		});
+
+		t.end();
+	});
+
+	test('SetFunctionLength', function (t) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.SetFunctionLength(nonFunction, 0); },
+				TypeError,
+				debug(nonFunction) + ' is not a Function'
+			);
+		});
+
+		t.test('non-extensible function', { skip: !Object.preventExtensions }, function (st) {
+			var F = function F() {};
+			Object.preventExtensions(F);
+
+			st['throws'](
+				function () { ES.SetFunctionLength(F, 0); },
+				TypeError,
+				'non-extensible function throws'
+			);
+			st.end();
+		});
+
+		var HasLength = function HasLength(_) { return _; };
+		t.equal(has(HasLength, 'length'), true, 'precondition: `HasLength` has own length');
+		t['throws'](
+			function () { ES.SetFunctionLength(HasLength, 0); },
+			TypeError,
+			'function with own length throws'
+		);
+
+		t.test('no length', { skip: !functionsHaveConfigurableNames }, function (st) {
+			var HasNoLength = function HasNoLength() {};
+			delete HasNoLength.length;
+
+			st.equal(has(HasNoLength, 'length'), false, 'precondition: `HasNoLength` has no own length');
+
+			forEach(v.nonNumbers, function (nonNumber) {
+				st['throws'](
+					function () { ES.SetFunctionLength(HasNoLength, nonNumber); },
+					TypeError,
+					debug(nonNumber) + ' is not a Number'
+				);
+			});
+
+			forEach([-1, -42, -Infinity, Infinity].concat(v.nonIntegerNumbers), function (nonPositiveInteger) {
+				st['throws'](
+					function () { ES.SetFunctionLength(HasNoLength, nonPositiveInteger); },
+					TypeError,
+					debug(nonPositiveInteger) + ' is not a positive integer Number'
+				);
+			});
+
+			st.end();
+		});
+
+		// defines an own configurable non-enum non-write length property
+
+		t.end();
+	});
+
+	test('thisSymbolValue', function (t) {
+		forEach(v.nonSymbolPrimitives.concat(v.objects), function (nonSymbol) {
+			t['throws'](
+				function () { ES.thisSymbolValue(nonSymbol); },
+				v.hasSymbols ? TypeError : SyntaxError,
+				debug(nonSymbol) + ' is not a Symbol'
+			);
+		});
+
+		t.test('no native Symbols', { skip: v.hasSymbols }, function (st) {
+			forEach(v.objects.concat(v.primitives), function (value) {
+				st['throws'](
+					function () { ES.thisSymbolValue(value); },
+					SyntaxError,
+					'Symbols are not supported'
+				);
+			});
+			st.end();
+		});
+
+		t.test('symbol values', { skip: !v.hasSymbols }, function (st) {
+			forEach(v.symbols, function (symbol) {
+				st.equal(ES.thisSymbolValue(symbol), symbol, 'Symbol value of ' + debug(symbol) + ' is same symbol');
+
+				st.equal(
+					ES.thisSymbolValue(Object(symbol)),
+					symbol,
+					'Symbol value of ' + debug(Object(symbol)) + ' is ' + debug(symbol)
+				);
+			});
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('TimeString', function (t) {
+		forEach(v.nonNumbers.concat(NaN), function (nonNumberOrNaN) {
+			t['throws'](
+				function () { ES.TimeString(nonNumberOrNaN); },
+				TypeError,
+				debug(nonNumberOrNaN) + ' is not a non-NaN Number'
+			);
+		});
+
+		var tv = Date.UTC(2019, 8, 10, 7, 8, 9);
+		t.equal(ES.TimeString(tv), '07:08:09 GMT');
+		t.end();
+	});
+
+	test('UnicodeEscape', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.UnicodeEscape(nonString); },
+				TypeError,
+				debug(nonString) + ' is not a String'
+			);
+		});
+		t['throws'](
+			function () { ES.UnicodeEscape(''); },
+			TypeError,
+			'empty string does not have length 1'
+		);
+		t['throws'](
+			function () { ES.UnicodeEscape('ab'); },
+			TypeError,
+			'2-char string does not have length 1'
+		);
+
+		t.equal(ES.UnicodeEscape(' '), '\\u0020');
+		t.equal(ES.UnicodeEscape('a'), '\\u0061');
+		t.equal(ES.UnicodeEscape(leadingPoo), '\\ud83d');
+		t.equal(ES.UnicodeEscape(trailingPoo), '\\udca9');
+
+		t.end();
+	});
+};
+
+var es2019 = function ES2019(ES, ops, expectedMissing, skips) {
+	es2018(ES, ops, expectedMissing, assign({}, skips, {
+	}));
+	var test = makeTest(skips);
+
+	test('AddEntriesFromIterable', function (t) {
+		t['throws'](
+			function () { ES.AddEntriesFromIterable({}, undefined, function () {}); },
+			TypeError,
+			'iterable must not be undefined'
+		);
+		t['throws'](
+			function () { ES.AddEntriesFromIterable({}, null, function () {}); },
+			TypeError,
+			'iterable must not be null'
+		);
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { ES.AddEntriesFromIterable({}, {}, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('Symbol support', { skip: !v.hasSymbols }, function (st) {
+			st.plan(4);
+
+			var O = {};
+			st.equal(ES.AddEntriesFromIterable(O, [], function () {}), O, 'returns the target');
+
+			var adder = function (key, value) {
+				st.equal(this, O, 'adder gets proper receiver');
+				st.equal(key, 0, 'k is key');
+				st.equal(value, 'a', 'v is value');
+			};
+			ES.AddEntriesFromIterable(O, ['a'].entries(), adder);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('FlattenIntoArray', function (t) {
+		t.test('no mapper function', function (st) {
+			var testDepth = function testDepth(tt, depth, expected) {
+				var a = [];
+				var o = [[1], 2, , [[3]], [], 4, [[[[5]]]]]; // eslint-disable-line no-sparse-arrays
+				ES.FlattenIntoArray(a, o, o.length, 0, depth);
+				tt.deepEqual(a, expected, 'depth: ' + depth);
+			};
+
+			testDepth(st, 1, [1, 2, [3], 4, [[[5]]]]);
+			testDepth(st, 2, [1, 2, 3, 4, [[5]]]);
+			testDepth(st, 3, [1, 2, 3, 4, [5]]);
+			testDepth(st, 4, [1, 2, 3, 4, 5]);
+			testDepth(st, Infinity, [1, 2, 3, 4, 5]);
+			st.end();
+		});
+
+		t.test('mapper function', function (st) {
+			var testMapper = function testMapper(tt, mapper, expected, thisArg) {
+				var a = [];
+				var o = [[1], 2, , [[3]], [], 4, [[[[5]]]]]; // eslint-disable-line no-sparse-arrays
+				ES.FlattenIntoArray(a, o, o.length, 0, 1, mapper, thisArg);
+				tt.deepEqual(a, expected);
+			};
+
+			var double = function double(x) {
+				return typeof x === 'number' ? 2 * x : x;
+			};
+			testMapper(
+				st,
+				double,
+				[1, 4, [3], 8, [[[5]]]]
+			);
+			var receiver = hasStrictMode ? 42 : Object(42);
+			testMapper(
+				st,
+				function (x) { return [this, double(x)]; },
+				[receiver, [1], receiver, 4, receiver, [[3]], receiver, [], receiver, 8, receiver, [[[[5]]]]],
+				42
+			);
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('TrimString', function (t) {
+		t.test('non-object string', function (st) {
+			forEach(v.nullPrimitives, function (nullish) {
+				st['throws'](
+					function () { ES.TrimString(nullish); },
+					debug(nullish) + ' is not an Object'
+				);
+			});
+			st.end();
+		});
+
+		var string = ' \n abc  \n ';
+		t.equal(ES.TrimString(string, 'start'), string.slice(string.indexOf('a')));
+		t.equal(ES.TrimString(string, 'end'), string.slice(0, string.lastIndexOf('c') + 1));
+		t.equal(ES.TrimString(string, 'start+end'), string.slice(string.indexOf('a'), string.lastIndexOf('c') + 1));
+
+		t.end();
+	});
+};
+
+var es2020 = function ES2020(ES, ops, expectedMissing, skips) {
+	es2019(ES, ops, expectedMissing, assign({}, skips, {
+		CopyDataProperties: true,
+		GetIterator: true,
+		NumberToString: true,
+		ObjectCreate: true,
+		SameValueNonNumber: true,
+		ToInteger: true,
+		UTF16Decode: true
+	}));
+	var test = makeTest(skips);
+
+	test('BigInt::add', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.add(nonBigInt, 0); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.add(0, nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.add($BigInt(0), $BigInt(0)), $BigInt(0), '0n + 0n is 0n');
+
+		forEach(v.bigints, function (bigint) {
+			if (bigint !== $BigInt(0)) {
+				t.equal(ES.BigInt.add(bigint, $BigInt(0)), bigint, debug(bigint) + ' + 0n adds to ' + bigint);
+			}
+			t.equal(ES.BigInt.add(bigint, $BigInt(1)), bigint + $BigInt(1), debug(bigint) + ' + 1n adds to ' + (bigint + $BigInt(1)));
+			t.equal(ES.BigInt.add(bigint, -$BigInt(42)), bigint - $BigInt(42), debug(bigint) + ' + -42n adds to ' + (bigint - $BigInt(42)));
+		});
+
+		t.end();
+	});
+
+	test('BigInt::bitwiseAND', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.bitwiseAND(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.bitwiseAND($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.bitwiseAND($BigInt(1), $BigInt(2)), $BigInt(1) & $BigInt(2));
+
+		t.end();
+	});
+
+	test('BigInt::bitwiseNOT', function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.bitwiseNOT(nonBigInt); },
+				TypeError,
+				debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.test('actual BigInts', { skip: !hasBigInts }, function (st) {
+			forEach(v.int32s, function (int32) {
+				var bigInt32 = $BigInt(int32);
+				st.equal(ES.BigInt.bitwiseNOT(bigInt32), ~bigInt32, debug(bigInt32) + ' becomes ~' + debug(bigInt32));
+			});
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('BigInt::bitwiseOR', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.bitwiseOR(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.bitwiseOR($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.bitwiseOR($BigInt(1), $BigInt(2)), $BigInt(1) | $BigInt(2));
+
+		t.end();
+	});
+
+	test('BigInt::bitwiseXOR', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.bitwiseXOR(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.bitwiseXOR($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.bitwiseXOR($BigInt(1), $BigInt(2)), $BigInt(1) ^ $BigInt(2));
+
+		t.end();
+	});
+
+	test('BigInt::divide', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.divide(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.divide($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t['throws'](
+			function () { ES.BigInt.divide($BigInt(1), $BigInt(0)); },
+			RangeError,
+			'dividing by zero throws'
+		);
+
+		forEach(v.bigints, function (bigint) {
+			if (bigint !== $BigInt(0)) {
+				t.equal(ES.BigInt.divide(bigint, bigint), $BigInt(1), debug(bigint) + ' divided by itself is 1n');
+				t.equal(ES.BigInt.divide(bigint, $BigInt(2)), bigint / $BigInt(2), debug(bigint) + ' divided by 2n is half itself');
+			}
+		});
+
+		t.end();
+	});
+
+	test('BigInt::equal', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.equal(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.Number.equal($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a Number'
+			);
+		});
+
+		forEach(v.bigints, function (bigint) {
+			if (BigInt !== $BigInt(0)) {
+				t.equal(ES.BigInt.equal(bigint, bigint), true, debug(bigint) + ' is equal to itself');
+				t.equal(ES.BigInt.equal(bigint, bigint + $BigInt(1)), false, debug(bigint) + ' is not equal to itself plus 1n');
+			}
+		});
+
+		t.end();
+	});
+
+	test('BigInt::exponentiate', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.exponentiate(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'base: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.exponentiate($BigInt(0), nonBigInt); },
+				TypeError,
+				'exponent: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t['throws'](
+			function () { ES.BigInt.exponentiate($BigInt(1), -$BigInt(1)); },
+			RangeError,
+			'negative exponent throws'
+		);
+
+		forEach(v.bigints, function (bigint) {
+			if (bigint !== $BigInt(0)) {
+				t.equal(ES.BigInt.exponentiate(bigint, $BigInt(0)), $BigInt(1), debug(bigint) + ' ** 0n is 1n');
+
+				var square = bigint;
+				for (var i = 0; i < Number(bigint); i += 1) {
+					square += bigint;
+				}
+				t.equal(ES.BigInt.exponentiate(bigint, bigint), square, debug(bigint) + ' ** ' + debug(bigint) + ' is equal to ' + debug(square));
+			}
+		});
+
+		t.end();
+	});
+
+	test('BigInt::leftShift', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.leftShift(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.leftShift($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			var bigInt32 = $BigInt(int32);
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				var bitsN = $BigInt(bits);
+				t.equal(
+					ES.BigInt.leftShift(bigInt32, bitsN),
+					bigInt32 << bitsN,
+					debug(bigInt32) + ' << ' + debug(bitsN) + ' is ' + debug(bigInt32 << bitsN)
+				);
+			});
+		});
+
+		t.end();
+	});
+
+	test('BigInt::lessThan', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.lessThan(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.lessThan($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.lessThan($BigInt(0), $BigInt(0)), false, '0n < 0n is false');
+
+		forEach(v.bigints, function (bigint) {
+			t.equal(ES.BigInt.lessThan(bigint, bigint), false, debug(bigint) + ' is not less than itself');
+
+			t.equal(ES.BigInt.lessThan(bigint, bigint + $BigInt(1)), true, debug(bigint) + ' < ' + debug(bigint + $BigInt(1)) + ' is true');
+			t.equal(ES.BigInt.lessThan(bigint + $BigInt(1), bigint), false, debug(bigint + $BigInt(1)) + ' < ' + debug(bigint) + ' is false');
+		});
+
+		t.end();
+	});
+
+	test('BigInt::multiply', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.multiply(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.multiply($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.BigInt.multiply($BigInt(0), $BigInt(0)), $BigInt(0), '0n * 0n is 0n');
+
+		forEach(v.bigints, function (bigint) {
+			if (bigint !== $BigInt(0)) {
+				t.equal(ES.BigInt.multiply(bigint, $BigInt(0)), $BigInt(0), debug(bigint) + ' * 0n produces 0n');
+				t.equal(ES.BigInt.multiply(bigint, $BigInt(1)), bigint, debug(bigint) + ' * 1n produces itself');
+				t.equal(ES.BigInt.multiply(bigint, -$BigInt(42)), bigint * -$BigInt(42), debug(bigint) + ' * -42n produces ' + (bigint - $BigInt(42)));
+			}
+		});
+
+		t.end();
+	});
+
+	test('BigInt::remainder', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.remainder(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.remainder($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t['throws'](
+			function () { ES.BigInt.remainder($BigInt(1), $BigInt(0)); },
+			RangeError,
+			'dividing by zero throws'
+		);
+
+		forEach(v.bigints, function (bigint) {
+			if (bigint !== $BigInt(0)) {
+				t.equal(
+					ES.BigInt.remainder($BigInt(0), bigint),
+					$BigInt(0),
+					'0n % ' + debug(bigint) + ' is 0n'
+				);
+				t.equal(
+					ES.BigInt.remainder(bigint + $BigInt(1), bigint),
+					$BigInt(1),
+					debug(bigint) + ' % ' + debug(bigint + $BigInt(1)) + ' is 1n'
+				);
+			}
+		});
+
+		t.end();
+	});
+
+	test('BigInt::sameValue', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.sameValue(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.sameValue($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.sameValue($BigInt(0), $BigInt(0)), true, '0n is sameValue as 0n');
+
+		forEach(v.bigints, function (bigint) {
+			t.ok(ES.BigInt.sameValue(bigint, bigint), debug(bigint) + ' is the sameValue as itself');
+		});
+
+		t.end();
+	});
+
+	test('BigInt::sameValueZero', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.sameValueZero(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.sameValueZero($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		forEach(v.bigints, function (bigint) {
+			t.ok(ES.BigInt.sameValueZero(bigint, bigint), debug(bigint) + ' is the sameValueZero as itself');
+		});
+
+		t.end();
+	});
+
+	test('BigInt::signedRightShift', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.signedRightShift(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.signedRightShift($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			var bigInt32 = $BigInt(int32);
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				var bitsN = $BigInt(bits);
+				t.equal(
+					ES.BigInt.signedRightShift(bigInt32, bitsN),
+					bigInt32 >> bitsN,
+					debug(bigInt32) + ' >> ' + debug(bitsN) + ' is ' + debug(bigInt32 >> bitsN)
+				);
+			});
+		});
+
+		t.end();
+	});
+
+	test('BigInt::subtract', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.subtract(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.subtract($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.equal(ES.BigInt.subtract($BigInt(0), $BigInt(0)), $BigInt(0), '0n - 0n is 0n');
+
+		forEach(v.bigints, function (bigint) {
+			t.equal(ES.BigInt.subtract(bigint, $BigInt(0)), bigint, debug(bigint) + ' - 0n produces ' + bigint);
+			t.equal(ES.BigInt.subtract(bigint, $BigInt(1)), bigint - $BigInt(1), debug(bigint) + ' - 1n produces ' + (bigint + $BigInt(1)));
+			t.equal(ES.BigInt.subtract(bigint, $BigInt(42)), bigint - $BigInt(42), debug(bigint) + ' - 42n produces ' + (bigint - $BigInt(42)));
+		});
+
+		t.end();
+	});
+
+	test('BigInt::toString', function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.toString(nonBigInt); },
+				TypeError,
+				debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		forEach(v.bigints, function (bigint) {
+			t.equal(ES.BigInt.toString(bigint), String(bigint), debug(bigint) + ' stringifies to ' + bigint);
+		});
+
+		t.end();
+	});
+
+	test('BigInt::unaryMinus', function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.unaryMinus(nonBigInt); },
+				TypeError,
+				debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.test('actual BigInts', { skip: !hasBigInts }, function (st) {
+			forEach(v.bigints, function (bigint) {
+				st.equal(ES.BigInt.unaryMinus(bigint), -bigint, debug(bigint) + ' produces -' + debug(bigint));
+			});
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('BigInt::unsignedRightShift', { skip: !hasBigInts }, function (t) {
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.BigInt.unsignedRightShift(nonBigInt, $BigInt(0)); },
+				TypeError,
+				'x: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+			t['throws'](
+				function () { ES.BigInt.unsignedRightShift($BigInt(0), nonBigInt); },
+				TypeError,
+				'y: ' + debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			var bigInt32 = $BigInt(int32);
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				var bitsN = $BigInt(bits);
+				t['throws'](
+					function () { ES.BigInt.unsignedRightShift(bigInt32, bitsN); },
+					TypeError,
+					debug(bigInt32) + ' >>> ' + debug(bitsN) + ' throws'
+				);
+			});
+		});
+
+		t.end();
+	});
+
+	test('BigIntBitwiseOp', { skip: !hasBigInts }, function (t) {
+		t['throws'](
+			function () { ES.BigIntBitwiseOp('invalid', BigInt(0), BigInt(0)); },
+			TypeError,
+			'throws with an invalid op'
+		);
+
+		t.equal(ES.BigIntBitwiseOp('&', BigInt(1), BigInt(2)), BigInt(1) & BigInt(2));
+		t.equal(ES.BigIntBitwiseOp('|', BigInt(1), BigInt(2)), BigInt(1) | BigInt(2));
+		t.equal(ES.BigIntBitwiseOp('^', BigInt(1), BigInt(2)), BigInt(1) ^ BigInt(2));
+
+		t.end();
+	});
+
+	test('BinaryAnd', function (t) {
+		t.equal(ES.BinaryAnd(0, 0), 0);
+		t.equal(ES.BinaryAnd(0, 1), 0);
+		t.equal(ES.BinaryAnd(1, 0), 0);
+		t.equal(ES.BinaryAnd(1, 1), 1);
+
+		forEach(v.nonIntegerNumbers.concat(v.nonNumberPrimitives, v.objects), function (nonBit) {
+			t['throws'](
+				function () { ES.BinaryAnd(0, nonBit); },
+				TypeError
+			);
+			t['throws'](
+				function () { ES.BinaryAnd(nonBit, 1); },
+				TypeError
+			);
+		});
+		t.end();
+	});
+
+	test('BinaryOr', function (t) {
+		t.equal(ES.BinaryOr(0, 0), 0);
+		t.equal(ES.BinaryOr(0, 1), 1);
+		t.equal(ES.BinaryOr(1, 0), 1);
+		t.equal(ES.BinaryOr(1, 1), 1);
+
+		forEach(v.nonIntegerNumbers.concat(v.nonNumberPrimitives, v.objects), function (nonBit) {
+			t['throws'](
+				function () { ES.BinaryOr(0, nonBit); },
+				TypeError
+			);
+			t['throws'](
+				function () { ES.BinaryOr(nonBit, 1); },
+				TypeError
+			);
+		});
+		t.end();
+	});
+
+	test('BinaryXor', function (t) {
+		t.equal(ES.BinaryXor(0, 0), 0);
+		t.equal(ES.BinaryXor(0, 1), 1);
+		t.equal(ES.BinaryXor(1, 0), 1);
+		t.equal(ES.BinaryXor(1, 1), 0);
+
+		forEach(v.nonIntegerNumbers.concat(v.nonNumberPrimitives, v.objects), function (nonBit) {
+			t['throws'](
+				function () { ES.BinaryXor(0, nonBit); },
+				TypeError
+			);
+			t['throws'](
+				function () { ES.BinaryXor(nonBit, 1); },
+				TypeError
+			);
+		});
+		t.end();
+	});
+
+	test('CodePointAt', function (t) {
+		t['throws'](
+			function () { ES.CodePointAt('abc', -1); },
+			TypeError,
+			'requires an index >= 0'
+		);
+		t['throws'](
+			function () { ES.CodePointAt('abc', 3); },
+			TypeError,
+			'requires an index < string length'
+		);
+
+		t.deepEqual(ES.CodePointAt('abc', 0), {
+			'[[CodePoint]]': 'a',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+		t.deepEqual(ES.CodePointAt('abc', 1), {
+			'[[CodePoint]]': 'b',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+		t.deepEqual(ES.CodePointAt('abc', 2), {
+			'[[CodePoint]]': 'c',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+
+		var strWithHalfPoo = 'a' + leadingPoo + 'c';
+		var strWithWholePoo = 'a' + wholePoo + 'd';
+
+		t.deepEqual(ES.CodePointAt(strWithHalfPoo, 0), {
+			'[[CodePoint]]': 'a',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+		t.deepEqual(ES.CodePointAt(strWithHalfPoo, 1), {
+			'[[CodePoint]]': leadingPoo,
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': true
+		});
+		t.deepEqual(ES.CodePointAt(strWithHalfPoo, 2), {
+			'[[CodePoint]]': 'c',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+
+		t.deepEqual(ES.CodePointAt(strWithWholePoo, 0), {
+			'[[CodePoint]]': 'a',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+		t.deepEqual(ES.CodePointAt(strWithWholePoo, 1), {
+			'[[CodePoint]]': wholePoo,
+			'[[CodeUnitCount]]': 2,
+			'[[IsUnpairedSurrogate]]': false
+		});
+		t.deepEqual(ES.CodePointAt(strWithWholePoo, 2), {
+			'[[CodePoint]]': trailingPoo,
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': true
+		});
+		t.deepEqual(ES.CodePointAt(strWithWholePoo, 3), {
+			'[[CodePoint]]': 'd',
+			'[[CodeUnitCount]]': 1,
+			'[[IsUnpairedSurrogate]]': false
+		});
+
+		t.end();
+	});
+
+	test('CopyDataProperties', function (t) {
+		t.test('first argument: target', function (st) {
+			forEach(v.primitives, function (primitive) {
+				st['throws'](
+					function () { ES.CopyDataProperties(primitive, {}, []); },
+					TypeError,
+					debug(primitive) + ' is not an Object'
+				);
+			});
+			st.end();
+		});
+
+		t.test('second argument: source', function (st) {
+			var frozenTarget = Object.freeze ? Object.freeze({}) : {};
+			forEach(v.nullPrimitives, function (nullish) {
+				st.equal(
+					ES.CopyDataProperties(frozenTarget, nullish, []),
+					frozenTarget,
+					debug(nullish) + ' "source" yields identical, unmodified target'
+				);
+			});
+
+			forEach(v.nonNullPrimitives, function (objectCoercible) {
+				var target = {};
+				var result = ES.CopyDataProperties(target, objectCoercible, []);
+				st.equal(result, target, 'result === target');
+				st.deepEqual(keys(result), keys(Object(objectCoercible)), 'target ends up with keys of ' + debug(objectCoercible));
+			});
+
+			st.test('enumerable accessor property', { skip: !defineProperty.oDP }, function (s2t) {
+				var target = {};
+				var source = {};
+				defineProperty(source, 'a', {
+					enumerable: true,
+					get: function () { return 42; }
+				});
+				var result = ES.CopyDataProperties(target, source, []);
+				s2t.equal(result, target, 'result === target');
+				s2t.deepEqual(result, { a: 42 }, 'target ends up with enumerable accessor of source');
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		t.test('third argument: excludedItems', function (st) {
+			forEach(v.objects.concat(v.primitives), function (nonArray) {
+				st['throws'](
+					function () { ES.CopyDataProperties({}, {}, nonArray); },
+					TypeError,
+					debug(nonArray) + ' is not an Array'
+				);
+			});
+
+			forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+				st['throws'](
+					function () { ES.CopyDataProperties({}, {}, [nonPropertyKey]); },
+					TypeError,
+					debug(nonPropertyKey) + ' is not a Property Key'
+				);
+			});
+
+			var result = ES.CopyDataProperties({}, { a: 1, b: 2, c: 3 }, ['b']);
+			st.deepEqual(keys(result).sort(), ['a', 'c'].sort(), 'excluded string keys are excluded');
+
+			st.test('excluding symbols', { skip: !v.hasSymbols }, function (s2t) {
+				var source = {};
+				forEach(v.symbols, function (symbol) {
+					source[symbol] = true;
+				});
+
+				var includedSymbols = v.symbols.slice(1);
+				var excludedSymbols = v.symbols.slice(0, 1);
+				var target = ES.CopyDataProperties({}, source, excludedSymbols);
+
+				forEach(includedSymbols, function (symbol) {
+					s2t.equal(has(target, symbol), true, debug(symbol) + ' is included');
+				});
+
+				forEach(excludedSymbols, function (symbol) {
+					s2t.equal(has(target, symbol), false, debug(symbol) + ' is excluded');
+				});
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		// TODO: CopyDataProperties throws when copying fails
+
+		t.end();
+	});
+
+	test('GetIterator', function (t) {
+		try {
+			ES.GetIterator({}, null);
+		} catch (e) {
+			t.ok(e.message.indexOf('Assertion failed: `hint` must be one of \'sync\' or \'async\'' >= 0));
+		}
+
+		var arr = [1, 2];
+		testIterator(t, ES.GetIterator(arr), arr);
+
+		testIterator(t, ES.GetIterator('abc'), 'abc'.split(''));
+
+		t.test('Symbol.iterator', { skip: !v.hasSymbols }, function (st) {
+			var m = new Map();
+			m.set(1, 'a');
+			m.set(2, 'b');
+
+			testIterator(st, ES.GetIterator(m), [[1, 'a'], [2, 'b']]);
+
+			st.end();
+		});
+
+		t.test('Symbol.asyncIterator', { skip: !v.hasSymbols || !Symbol.asyncIterator }, function (st) {
+			try {
+				ES.GetIterator(arr, 'async');
+			} catch (e) {
+				st.ok(e.message.indexOf("async from sync iterators aren't currently supported") >= 0);
+			}
+
+			var it = {
+				next: function () {
+					return Promise.resolve({
+						done: true
+					});
+				}
+			};
+			var obj = {};
+			obj[Symbol.asyncIterator] = function () {
+				return it;
+			};
+
+			st.equal(ES.GetIterator(obj, 'async'), it);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	var unclampedUnsignedIntegerTypes = [
+		'Int8',
+		'Int16',
+		'Int32'
+	];
+	var clampedTypes = [
+		'Uint8C'
+	];
+	var unclampedSignedIntegerTypes = [
+		'Uint8',
+		'Uint16',
+		'Uint32'
+	];
+	var unclampedIntegerTypes = unclampedUnsignedIntegerTypes.concat(unclampedSignedIntegerTypes);
+	var floatTypes = [
+		'Float32',
+		'Float64'
+	];
+	var integerTypes = unclampedIntegerTypes.concat(clampedTypes, floatTypes);
+	var bigIntTypes = [
+		'BigInt64',
+		'BigUint64'
+	];
+	var numberTypes = floatTypes.concat(integerTypes);
+	var nonIntegerTypes = floatTypes.concat(bigIntTypes);
+	var unsignedElementTypes = unclampedSignedIntegerTypes.concat([
+		'BigUint64'
+	]);
+	var signedElementTypes = unclampedUnsignedIntegerTypes;
+
+	test('IsBigIntElementType', function (t) {
+		forEach(bigIntTypes, function (type) {
+			t.equal(
+				ES.IsBigIntElementType(type),
+				true,
+				debug(type) + ' is a BigInt element type'
+			);
+		});
+
+		forEach(numberTypes, function (type) {
+			t.equal(
+				ES.IsBigIntElementType(type),
+				false,
+				debug(type) + ' is not a BigInt element type'
+			);
+		});
+
+		t.end();
+	});
+
+	test('IsUnsignedElementType', function (t) {
+		forEach(unsignedElementTypes, function (type) {
+			t.equal(
+				ES.IsUnsignedElementType(type),
+				true,
+				debug(type) + ' is an unsigned element type'
+			);
+		});
+
+		forEach(signedElementTypes, function (type) {
+			t.equal(
+				ES.IsUnsignedElementType(type),
+				false,
+				debug(type) + ' is not an unsigned element type'
+			);
+		});
+
+		t.end();
+	});
+
+	test('IsUnclampedIntegerElementType', function (t) {
+		forEach(unclampedIntegerTypes, function (type) {
+			t.equal(
+				ES.IsUnclampedIntegerElementType(type),
+				true,
+				debug(type) + ' is an unclamped integer element type'
+			);
+		});
+
+		forEach(clampedTypes.concat(nonIntegerTypes), function (type) {
+			t.equal(
+				ES.IsUnclampedIntegerElementType(type),
+				false,
+				debug(type) + ' is not an unclamped integer element type'
+			);
+		});
+
+		t.end();
+	});
+
+	test('IsNonNegativeInteger', function (t) {
+		forEach(v.notNonNegativeIntegers, function (nonIntegerNumber) {
+			t.equal(
+				ES.IsNonNegativeInteger(nonIntegerNumber),
+				false,
+				debug(nonIntegerNumber) + ' is not a non-negative integer'
+			);
+		});
+
+		forEach(v.zeroes.concat(v.integerNumbers), function (nonNegativeInteger) {
+			t.equal(
+				ES.IsNonNegativeInteger(nonNegativeInteger),
+				true,
+				debug(nonNegativeInteger) + ' is a non-negative integer'
+			);
+		});
+
+		t.end();
+	});
+
+	test('IsNoTearConfiguration', function (t) {
+		forEach(unclampedIntegerTypes, function (type) {
+			t.equal(
+				ES.IsNoTearConfiguration(type),
+				true,
+				debug(type) + ' with any order is a no-tear configuration'
+			);
+		});
+
+		forEach(bigIntTypes, function (type) {
+			t.equal(
+				ES.IsNoTearConfiguration(type, 'Init'),
+				false,
+				debug(type) + ' with ' + debug('Init') + ' is not a no-tear configuration'
+			);
+
+			t.equal(
+				ES.IsNoTearConfiguration(type, 'Unordered'),
+				false,
+				debug(type) + ' with ' + debug('Unordered') + ' is not a no-tear configuration'
+			);
+
+			t.equal(
+				ES.IsNoTearConfiguration(type),
+				true,
+				debug(type) + ' with any other order is a no-tear configuration'
+			);
+		});
+
+		forEach(clampedTypes, function (type) {
+			t.equal(
+				ES.IsNoTearConfiguration(type),
+				false,
+				debug(type) + ' with any order is not a no-tear configuration'
+			);
+		});
+
+		t.end();
+	});
+
+	test('LengthOfArrayLike', function (t) {
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { ES.LengthOfArrayLike(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+		});
+
+		t.equal(ES.LengthOfArrayLike([]), 0);
+		t.equal(ES.LengthOfArrayLike([1]), 1);
+		t.equal(ES.LengthOfArrayLike({ length: 42 }), 42);
+
+		t.end();
+	});
+
+	test('Number::add', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.add(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.add(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.add(+Infinity, +Infinity), +Infinity, '+∞ + +∞ is +∞');
+		t.equal(ES.Number.add(-Infinity, -Infinity), -Infinity, '-∞ + -∞ is -∞');
+		t.equal(ES.Number.add(+Infinity, -Infinity), NaN, '+∞ + -∞ is NaN');
+		t.equal(ES.Number.add(-Infinity, +Infinity), NaN, '-∞ + +∞ is NaN');
+
+		t.equal(ES.Number.add(+0, +0), +0, '0 + 0 is +0');
+		t.equal(ES.Number.add(+0, -0), +0, '0 + -0 is +0');
+		t.equal(ES.Number.add(-0, +0), +0, '-0 + 0 is +0');
+		t.equal(ES.Number.add(-0, -0), -0, '-0 + -0 is -0');
+
+		forEach(v.numbers, function (number) {
+			if (number !== 0) {
+				t.equal(ES.Number.add(number, 0), number, debug(number) + ' + 0 adds to ' + number);
+			}
+			t.equal(ES.Number.add(number, 1), number + 1, debug(number) + ' + 1 adds to ' + (number + 1));
+			t.equal(ES.Number.add(1, number), number + 1, '1 + ' + debug(number) + ' adds to ' + (number + 1));
+			t.equal(ES.Number.add(number, -42), number - 42, debug(number) + ' + -42 adds to ' + (number - 42));
+			t.equal(ES.Number.add(-42, number), number - 42, '-42 + ' + debug(number) + ' adds to ' + (number - 42));
+		});
+
+		t.end();
+	});
+
+	test('Number::bitwiseAND', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.bitwiseAND(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.bitwiseAND(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.bitwiseAND(1, 2), 1 & 2);
+
+		t.end();
+	});
+
+	test('Number::bitwiseNOT', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.bitwiseNOT(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach(v.int32s, function (int32) {
+			t.equal(ES.Number.bitwiseNOT(int32), ~int32, debug(int32) + ' becomes ~' + debug(int32));
+		});
+
+		t.end();
+	});
+
+	test('Number::bitwiseOR', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.bitwiseOR(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.bitwiseOR(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.bitwiseOR(1, 2), 1 | 2);
+
+		t.end();
+	});
+
+	test('Number::bitwiseXOR', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.bitwiseXOR(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.bitwiseXOR(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.bitwiseXOR(1, 2), 1 ^ 2);
+
+		t.end();
+	});
+
+	test('Number::divide', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.divide(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.divide(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.divide(Infinity, Infinity), NaN, '∞ / ∞ is NaN');
+		t.equal(ES.Number.divide(-Infinity, Infinity), NaN, '-∞ / ∞ is NaN');
+		t.equal(ES.Number.divide(Infinity, -Infinity), NaN, '∞ / -∞ is NaN');
+		t.equal(ES.Number.divide(-Infinity, -Infinity), NaN, '-∞ / -∞ is NaN');
+
+		t.equal(ES.Number.divide(NaN, NaN), NaN, 'NaN / NaN is NaN');
+
+		t.equal(ES.Number.divide(+Infinity, +0), +Infinity, '+∞ / +0 is +∞');
+		t.equal(ES.Number.divide(-Infinity, -0), +Infinity, '-∞ / -0 is +∞');
+		t.equal(ES.Number.divide(+Infinity, -0), -Infinity, '+∞ / -0 is -∞');
+		t.equal(ES.Number.divide(-Infinity, +0), -Infinity, '-∞ / +0 is -∞');
+
+		t.equal(ES.Number.divide(+0, +Infinity), +0, '+0 / +∞ is +0');
+		t.equal(ES.Number.divide(-0, -Infinity), +0, '-0 / -∞ is +0');
+		t.equal(ES.Number.divide(-0, +Infinity), -0, '-0 / +∞ is -0');
+		t.equal(ES.Number.divide(+0, -Infinity), -0, '+0 / -∞ is -0');
+
+		forEach(v.numbers, function (number) {
+			if (number !== 0 && isFinite(number)) {
+				t.equal(ES.Number.divide(number, number), 1, debug(number) + ' divided by itself is 1');
+				t.equal(ES.Number.divide(number, 2), number / 2, debug(number) + ' divided by 2 is half itself');
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::equal', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.equal(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.equal(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.equal(Infinity, Infinity), true, '∞ === ∞');
+		t.equal(ES.Number.equal(-Infinity, Infinity), false, '-∞ !== ∞');
+		t.equal(ES.Number.equal(Infinity, -Infinity), false, '∞ !== -∞');
+		t.equal(ES.Number.equal(-Infinity, -Infinity), true, '-∞ === -∞');
+
+		t.equal(ES.Number.equal(NaN, NaN), false, 'NaN !== NaN');
+
+		t.equal(ES.Number.equal(Infinity, 0), false, '∞ !== 0');
+		t.equal(ES.Number.equal(-Infinity, -0), false, '-∞ !== -0');
+		t.equal(ES.Number.equal(Infinity, -0), false, '∞ !== -0');
+		t.equal(ES.Number.equal(-Infinity, 0), false, '-∞ !== 0');
+
+		t.equal(ES.Number.equal(+0, +0), true, '+0 === +0');
+		t.equal(ES.Number.equal(+0, -0), true, '+0 === -0');
+		t.equal(ES.Number.equal(-0, +0), true, '-0 === +0');
+		t.equal(ES.Number.equal(-0, -0), true, '-0 === -0');
+
+		forEach(v.numbers, function (number) {
+			if (isFinite(number)) {
+				t.equal(ES.Number.equal(number, number), true, debug(number) + ' is equal to itself');
+				t.equal(ES.Number.equal(number, number + 1), false, debug(number) + ' is not equal to itself plus 1');
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::exponentiate', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.exponentiate(nonNumber, 0); },
+				TypeError,
+				'base: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.exponentiate(0, nonNumber); },
+				TypeError,
+				'exponent: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.exponentiate(0, 42), 0, '+0 ** 42 is +0');
+		t.equal(ES.Number.exponentiate(0, -42), Infinity, '+0 ** 42 is +∞');
+		t.equal(ES.Number.exponentiate(-0, 42), 0, '-0 ** 42 is +0');
+		t.equal(ES.Number.exponentiate(-0, 41), -0, '-0 ** 41 is -0');
+		t.equal(ES.Number.exponentiate(-0, -42), Infinity, '-0 ** 42 is +∞');
+		t.equal(ES.Number.exponentiate(-0, -41), -Infinity, '-0 ** 41 is -∞');
+
+		t.equal(ES.Number.exponentiate(Infinity, 0), 1, '+∞ ** 0 is 1');
+		t.equal(ES.Number.exponentiate(Infinity, -0), 1, '+∞ ** -0 is 1');
+		t.equal(ES.Number.exponentiate(-Infinity, 0), 1, '-∞ ** 0 is 1');
+		t.equal(ES.Number.exponentiate(-Infinity, -0), 1, '-∞ ** -0 is 1');
+
+		t.equal(ES.Number.exponentiate(Infinity, 1), Infinity, '+∞ ** 1 is +∞');
+		t.equal(ES.Number.exponentiate(Infinity, 2), Infinity, '+∞ ** 2 is +∞');
+		t.equal(ES.Number.exponentiate(Infinity, -1), +0, '+∞ ** -1 is +0');
+		t.equal(ES.Number.exponentiate(Infinity, -2), +0, '+∞ ** -2 is +0');
+
+		t.equal(ES.Number.exponentiate(-Infinity, 1), -Infinity, '-∞ ** 1 is -∞');
+		t.equal(ES.Number.exponentiate(-Infinity, 2), Infinity, '-∞ ** 2 is +∞');
+		t.equal(ES.Number.exponentiate(-Infinity, -1), -0, '-∞ ** --1 is -0');
+		t.equal(ES.Number.exponentiate(-Infinity, -2), +0, '-∞ ** --2 is +0');
+
+		t.equal(ES.Number.exponentiate(1.1, Infinity), Infinity, '1.1 ** +∞ is +∞');
+		t.equal(ES.Number.exponentiate(1.1, -Infinity), 0, '1.1 ** -∞ is +0');
+		t.equal(ES.Number.exponentiate(-1.1, Infinity), Infinity, '-1.1 ** +∞ is +∞');
+		t.equal(ES.Number.exponentiate(-1.1, -Infinity), 0, '-1.1 ** -∞ is +0');
+
+		t.equal(ES.Number.exponentiate(1, Infinity), NaN, '1 ** +∞ is NaN');
+		t.equal(ES.Number.exponentiate(1, -Infinity), NaN, '1 ** -∞ is NaN');
+		t.equal(ES.Number.exponentiate(-1, Infinity), NaN, '-1 ** +∞ is NaN');
+		t.equal(ES.Number.exponentiate(-1, -Infinity), NaN, '-1 ** -∞ is NaN');
+
+		t.equal(ES.Number.exponentiate(0.9, Infinity), 0, '0.9 ** +∞ is +0');
+		t.equal(ES.Number.exponentiate(0.9, -Infinity), Infinity, '0.9 ** -∞ is ∞');
+		t.equal(ES.Number.exponentiate(-0.9, Infinity), 0, '-0.9 ** +∞ is +0');
+		t.equal(ES.Number.exponentiate(-0.9, -Infinity), Infinity, '-0.9 ** -∞ is +∞');
+
+		forEach(v.numbers.concat(NaN), function (number) {
+			t.equal(ES.Number.exponentiate(number, NaN), NaN, debug(number) + ' ** NaN is NaN');
+
+			if (number !== 0) {
+				t.equal(ES.Number.exponentiate(number, 0), 1, debug(number) + ' ** +0 is 1');
+				t.equal(ES.Number.exponentiate(number, -0), 1, debug(number) + ' ** -0 is 1');
+				t.equal(ES.Number.exponentiate(NaN, number), NaN, 'NaN ** ' + debug(number) + ' is NaN');
+			}
+
+			if (number !== 0 && isFinite(number)) {
+				t.equal(ES.Number.equal(number, number), true, debug(number) + ' is equal to itself');
+				t.equal(ES.Number.equal(number, number + 1), false, debug(number) + ' is not equal to itself plus 1');
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::leftShift', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.leftShift(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.leftShift(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				t.equal(ES.Number.leftShift(int32, bits), int32 << bits, debug(int32) + ' << ' + bits + ' is ' + debug(int32 << bits));
+			});
+		});
+
+		t.end();
+	});
+
+	test('Number::lessThan', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.lessThan(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.lessThan(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.lessThan(+0, -0), false, '+0 < -0 is false');
+		t.equal(ES.Number.lessThan(+0, +0), false, '+0 < +0 is false');
+		t.equal(ES.Number.lessThan(-0, +0), false, '-0 < +0 is false');
+		t.equal(ES.Number.lessThan(-0, -0), false, '-0 < -0 is false');
+
+		t.equal(ES.Number.lessThan(NaN, NaN), undefined, 'NaN < NaN is undefined');
+
+		t.equal(ES.Number.lessThan(+Infinity, +Infinity), false, '+∞ < +∞ is false');
+		t.equal(ES.Number.lessThan(+Infinity, -Infinity), false, '+∞ < -∞ is false');
+		t.equal(ES.Number.lessThan(-Infinity, +Infinity), true, '-∞ < +∞ is true');
+		t.equal(ES.Number.lessThan(-Infinity, -Infinity), false, '-∞ < -∞ is false');
+
+		forEach(v.numbers.concat(v.infinities), function (number) {
+			t.equal(ES.Number.lessThan(NaN, number), undefined, 'NaN < ' + debug(number) + ' is undefined');
+			t.equal(ES.Number.lessThan(number, NaN), undefined, debug(number) + ' < NaN is undefined');
+
+			t.equal(ES.Number.lessThan(number, number), false, debug(number) + ' is not less than itself');
+
+			if (isFinite(number)) {
+				t.equal(ES.Number.lessThan(number, number + 1), true, debug(number) + ' < ' + debug(number + 1) + ' is true');
+				t.equal(ES.Number.lessThan(number + 1, number), false, debug(number + 1) + ' < ' + debug(number) + ' is false');
+
+				t.equal(ES.Number.lessThan(Infinity, number), false, '+∞ < ' + debug(number) + ' is false');
+				t.equal(ES.Number.lessThan(number, Infinity), true, debug(number) + ' < +∞ is true');
+				t.equal(ES.Number.lessThan(-Infinity, number), true, '-∞ < ' + debug(number) + ' is true');
+				t.equal(ES.Number.lessThan(number, -Infinity), false, debug(number) + ' < -∞ is false');
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::multiply', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.multiply(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.multiply(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach([+0, -0, 1, -1], function (x) {
+			var expected = x === 0 ? NaN : Infinity;
+			t.equal(ES.Number.multiply(Infinity, x), expected, '+∞ * ' + debug(x) + ' is ' + debug(expected));
+			t.equal(ES.Number.multiply(x, Infinity), expected, debug(x) + ' * +∞ is ' + debug(expected));
+			t.equal(ES.Number.multiply(-Infinity, x), -expected, '-∞ * ' + debug(x) + ' is ' + debug(expected));
+			t.equal(ES.Number.multiply(x, -Infinity), -expected, debug(x) + ' * -∞ is ' + debug(expected));
+		});
+
+		t.equal(ES.Number.multiply(Infinity, Infinity), Infinity, '+∞ * +∞ is +∞');
+		t.equal(ES.Number.multiply(Infinity, -Infinity), -Infinity, '+∞ * -∞ is -∞');
+		t.equal(ES.Number.multiply(-Infinity, Infinity), -Infinity, '-∞ * +∞ is -∞');
+		t.equal(ES.Number.multiply(-Infinity, -Infinity), Infinity, '-∞ * -∞ is +∞');
+
+		t.equal(ES.Number.multiply(+0, +0), +0, '0 * 0 is +0');
+		t.equal(ES.Number.multiply(+0, -0), -0, '0 * -0 is -0');
+		t.equal(ES.Number.multiply(-0, +0), -0, '-0 * 0 is -0');
+		t.equal(ES.Number.multiply(-0, -0), +0, '-0 * -0 is +0');
+
+		forEach(v.numbers.concat(NaN), function (number) {
+			t.equal(ES.Number.multiply(NaN, number), NaN, 'NaN * ' + debug(number) + ' is NaN');
+			t.equal(ES.Number.multiply(number, NaN), NaN, debug(number) + ' * NaN is NaN');
+
+			if (number !== 0 && isFinite(number)) {
+				t.equal(ES.Number.multiply(number, 0), number > 0 ? 0 : -0, debug(number) + ' * +0 produces ' + (number > 0 ? '+0' : '-0'));
+				t.equal(ES.Number.multiply(0, number), number > 0 ? 0 : -0, '+0 * ' + debug(number) + ' produces ' + (number > 0 ? '+0' : '-0'));
+				t.equal(ES.Number.multiply(number, -0), number > 0 ? -0 : 0, debug(number) + ' * -0 produces ' + (number > 0 ? '-0' : '+0'));
+				t.equal(ES.Number.multiply(-0, number), number > 0 ? -0 : 0, '-0 * ' + debug(number) + ' produces ' + (number > 0 ? '-0' : '+0'));
+				t.equal(ES.Number.multiply(number, 1), number, debug(number) + ' * 1 produces itself');
+				t.equal(ES.Number.multiply(number, -42), number * -42, debug(number) + ' * -42 produces ' + (number - 42));
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::remainder', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.remainder(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.remainder(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.remainder(NaN, NaN), NaN, 'NaN % NaN is NaN');
+
+		t.equal(ES.Number.remainder(+0, +0), NaN, '+0 % +0 is NaN');
+		t.equal(ES.Number.remainder(+0, -0), NaN, '+0 % -0 is NaN');
+		t.equal(ES.Number.remainder(-0, +0), NaN, '-0 % +0 is NaN');
+		t.equal(ES.Number.remainder(-0, -0), NaN, '-0 % -0 is NaN');
+
+		forEach(v.numbers, function (number) {
+			t.equal(ES.Number.remainder(number, NaN), NaN, debug(number) + ' % NaN is NaN');
+			t.equal(ES.Number.remainder(NaN, number), NaN, 'NaN % ' + debug(number) + ' is NaN');
+
+			t.equal(ES.Number.remainder(Infinity, number), NaN, '+∞ % ' + debug(number) + ' is NaN');
+			t.equal(ES.Number.remainder(-Infinity, number), NaN, '-∞ % ' + debug(number) + ' is NaN');
+			t.equal(ES.Number.remainder(number, 0), NaN, debug(number) + ' % +0 is NaN');
+			t.equal(ES.Number.remainder(number, -0), NaN, debug(number) + ' % -0 is NaN');
+
+			if (isFinite(number)) {
+				t.equal(ES.Number.remainder(number, Infinity), number, debug(number) + ' % +∞ is ' + debug(number));
+				t.equal(ES.Number.remainder(number, -Infinity), number, debug(number) + ' % -∞ is ' + debug(number));
+				if (number !== 0) {
+					t.equal(ES.Number.remainder(0, number), 0, '+0 % ' + debug(number) + ' is ' + debug(number));
+					t.equal(ES.Number.remainder(-0, number), -0, '-0 % ' + debug(number) + ' is ' + debug(number));
+					t.looseEqual(ES.Number.remainder(number * 2, number), 0, debug(number) + ' % ' + debug(number * 2) + ' is 0');
+				}
+			}
+		});
+
+		t.end();
+	});
+
+	test('Number::sameValue', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.sameValue(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.sameValue(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.ok(ES.Number.sameValue(NaN, NaN), true, 'NaN is the sameValue as NaN');
+
+		t.equal(ES.Number.sameValue(+0, +0), true, '+0 is sameValue as +0');
+		t.equal(ES.Number.sameValue(+0, -0), false, '+0 is not sameValue as -0');
+		t.equal(ES.Number.sameValue(-0, +0), false, '-0 is not sameValue as +0');
+		t.equal(ES.Number.sameValue(-0, -0), true, '-0 is sameValue as -0');
+
+		forEach(v.numbers, function (number) {
+			t.ok(ES.Number.sameValue(number, number), debug(number) + ' is the sameValue as itself');
+		});
+
+		t.end();
+	});
+
+	test('Number::sameValueZero', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.sameValueZero(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.sameValueZero(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.ok(ES.Number.sameValueZero(NaN, NaN), true, 'NaN is the sameValueZero as NaN');
+
+		t.equal(ES.Number.sameValueZero(+0, +0), true, '+0 is sameValueZero as +0');
+		t.equal(ES.Number.sameValueZero(+0, -0), true, '+0 is sameValueZero as -0');
+		t.equal(ES.Number.sameValueZero(-0, +0), true, '-0 is sameValueZero as +0');
+		t.equal(ES.Number.sameValueZero(-0, -0), true, '-0 is sameValueZero as -0');
+
+		forEach(v.numbers, function (number) {
+			t.ok(ES.Number.sameValueZero(number, number), debug(number) + ' is the sameValueZero as itself');
+		});
+
+		t.end();
+	});
+
+	test('Number::signedRightShift', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.signedRightShift(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.signedRightShift(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				t.equal(ES.Number.signedRightShift(int32, bits), int32 >> bits, debug(int32) + ' >> ' + bits + ' is ' + debug(int32 >> bits));
+			});
+		});
+
+		t.end();
+	});
+
+	test('Number::subtract', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.subtract(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.subtract(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.subtract(+0, +0), +0, '0 - 0 is +0');
+		t.equal(ES.Number.subtract(+0, -0), +0, '0 - -0 is +0');
+		t.equal(ES.Number.subtract(-0, +0), -0, '-0 - 0 is -0');
+		t.equal(ES.Number.subtract(-0, -0), +0, '-0 - -0 is +0');
+
+		forEach(v.numbers, function (number) {
+			if (number !== 0) {
+				t.equal(ES.Number.subtract(number, 0), number, debug(number) + ' - 0 produces ' + number);
+			}
+			t.equal(ES.Number.subtract(number, 1), number - 1, debug(number) + ' - 1 produces ' + (number + 1));
+			t.equal(ES.Number.subtract(number, 42), number - 42, debug(number) + ' - 42 produces ' + (number - 42));
+		});
+
+		t.end();
+	});
+
+	test('Number::toString', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.toString(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach(v.numbers, function (number) {
+			t.equal(ES.Number.toString(number), String(number), debug(number) + ' stringifies to ' + number);
+		});
+
+		t.end();
+	});
+
+	test('Number::unaryMinus', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.unaryMinus(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.Number.unaryMinus(NaN), NaN, 'NaN produces NaN');
+
+		forEach(v.numbers, function (number) {
+			t.equal(ES.Number.unaryMinus(number), -number, debug(number) + ' produces -' + debug(number));
+		});
+
+		t.end();
+	});
+
+	test('Number::unsignedRightShift', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.Number.unsignedRightShift(nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.Number.unsignedRightShift(0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach([0].concat(v.int32s), function (int32) {
+			forEach([1, 3, 5, 31, 32, 33], function (bits) {
+				t.equal(ES.Number.unsignedRightShift(int32, bits), int32 >>> bits, debug(int32) + ' >>> ' + bits + ' is ' + debug(int32 >>> bits));
+			});
+		});
+
+		t.end();
+	});
+
+	test('NumberToBigInt', function (t) {
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.NumberToBigInt(nonNumber); },
+				TypeError,
+				debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		forEach(v.nonIntegerNumbers, function (nonIntegerNumber) {
+			t['throws'](
+				function () { ES.NumberToBigInt(nonIntegerNumber); },
+				RangeError,
+				debug(nonIntegerNumber) + ' is not an integer'
+			);
+		});
+
+		t.test('actual BigInts', { skip: !hasBigInts }, function (st) {
+			forEach(v.integerNumbers, function (int) {
+				if (int >= 1e17) {
+					// BigInt(1e17) throws on node v10.4 - v10.8
+					try {
+						st.equal(ES.NumberToBigInt(int), $BigInt(int), debug(int) + ' becomes ' + debug($BigInt(int)));
+					} catch (e) {
+						st['throws'](
+							function () { $BigInt(int); },
+							RangeError,
+							debug(int) + ' is too large on this engine to convert into a BigInt'
+						);
+					}
+				} else {
+					st.equal(ES.NumberToBigInt(int), $BigInt(int), debug(int) + ' becomes ' + debug($BigInt(int)));
+				}
+			});
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('OrdinaryObjectCreate', function (t) {
+		forEach(v.nonNullPrimitives, function (value) {
+			t['throws'](
+				function () { ES.OrdinaryObjectCreate(value); },
+				TypeError,
+				debug(value) + ' is not null, or an object'
+			);
+		});
+
+		t.test('proto arg', function (st) {
+			var Parent = function Parent() {};
+			Parent.prototype.foo = {};
+			var child = ES.OrdinaryObjectCreate(Parent.prototype);
+			st.equal(child instanceof Parent, true, 'child is instanceof Parent');
+			st.equal(child.foo, Parent.prototype.foo, 'child inherits properties from Parent.prototype');
+
+			st.end();
+		});
+
+		t.test('internal slots arg', function (st) {
+			st.doesNotThrow(function () { ES.OrdinaryObjectCreate({}, []); }, 'an empty slot list is valid');
+
+			st['throws'](
+				function () { ES.OrdinaryObjectCreate({}, ['a']); },
+				SyntaxError,
+				'internal slots are not supported'
+			);
+
+			st.end();
+		});
+
+		t.test('null proto', { skip: !$setProto }, function (st) {
+			st.equal('toString' in {}, true, 'normal objects have toString');
+			st.equal('toString' in ES.OrdinaryObjectCreate(null), false, 'makes a null object');
+
+			st.end();
+		});
+
+		t.test('null proto when no native Object.create', { skip: $setProto }, function (st) {
+			st['throws'](
+				function () { ES.OrdinaryObjectCreate(null); },
+				SyntaxError,
+				'without a native Object.create, can not create null objects'
+			);
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('SameValueNonNumeric', function (t) {
+		var willThrow = [
+			[3, 4],
+			[NaN, 4],
+			[4, ''],
+			['abc', true],
+			[{}, false]
+		];
+		forEach(willThrow, function (nums) {
+			t['throws'](function () { return ES.SameValueNonNumeric.apply(ES, nums); }, TypeError, 'value must be same type and non-number');
+		});
+
+		forEach(v.objects.concat(v.nonNumberPrimitives), function (val) {
+			t.equal(val === val, ES.SameValueNonNumeric(val, val), debug(val) + ' is SameValueNonNumeric to itself');
+		});
+
+		t.end();
+	});
+
+	test('StringPad', function (t) {
+		t.equal(ES.StringPad('a', 3, undefined, 'start'), '  a');
+		t.equal(ES.StringPad('a', 3, undefined, 'end'), 'a  ');
+		t.equal(ES.StringPad('a', 3, '0', 'start'), '00a');
+		t.equal(ES.StringPad('a', 3, '0', 'end'), 'a00');
+		t.equal(ES.StringPad('a', 3, '012', 'start'), '01a');
+		t.equal(ES.StringPad('a', 3, '012', 'end'), 'a01');
+		t.equal(ES.StringPad('a', 7, '012', 'start'), '012012a');
+		t.equal(ES.StringPad('a', 7, '012', 'end'), 'a012012');
+
+		t.end();
+	});
+
+	test('thisBigIntValue', { skip: !hasBigInts }, function (t) {
+		t.equal(ES.thisBigIntValue(BigInt(42)), BigInt(42));
+		t.equal(ES.thisBigIntValue(Object(BigInt(42))), BigInt(42));
+
+		forEach(v.nonBigInts, function (nonBigInt) {
+			t['throws'](
+				function () { ES.thisBigIntValue(nonBigInt); },
+				TypeError,
+				debug(nonBigInt) + ' is not a BigInt'
+			);
+		});
+
+		t.end();
+	});
+
+	test('ToInteger', function (t) {
+		forEach([0, -0, NaN], function (num) {
+			t.equal(0, ES.ToInteger(num), debug(num) + ' returns +0');
+		});
+		forEach([Infinity, 42], function (num) {
+			t.equal(num, ES.ToInteger(num), debug(num) + ' returns itself');
+			t.equal(-num, ES.ToInteger(-num), '-' + debug(num) + ' returns itself');
+		});
+		t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+		t['throws'](function () { return ES.ToInteger(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+		t.end();
+	});
+
+	test('UTF16DecodeSurrogatePair', function (t) {
+		t['throws'](
+			function () { ES.UTF16DecodeSurrogatePair('a'.charCodeAt(0), trailingPoo.charCodeAt(0)); },
+			TypeError,
+			'"a" is not a leading surrogate'
+		);
+		t['throws'](
+			function () { ES.UTF16DecodeSurrogatePair(leadingPoo.charCodeAt(0), 'b'.charCodeAt(0)); },
+			TypeError,
+			'"b" is not a trailing surrogate'
+		);
+
+		t.equal(ES.UTF16DecodeSurrogatePair(leadingPoo.charCodeAt(0), trailingPoo.charCodeAt(0)), wholePoo);
+
+		t.end();
+	});
+
+	test('NumberBitwiseOp', function (t) {
+		t['throws'](
+			function () { ES.NumberBitwiseOp('invalid', 0, 0); },
+			TypeError,
+			'throws with an invalid op'
+		);
+
+		forEach(v.nonNumbers, function (nonNumber) {
+			t['throws'](
+				function () { ES.NumberBitwiseOp('&', nonNumber, 0); },
+				TypeError,
+				'x: ' + debug(nonNumber) + ' is not a Number'
+			);
+			t['throws'](
+				function () { ES.NumberBitwiseOp('&', 0, nonNumber); },
+				TypeError,
+				'y: ' + debug(nonNumber) + ' is not a Number'
+			);
+		});
+
+		t.equal(ES.NumberBitwiseOp('&', 1, 2), 1 & 2);
+		t.equal(ES.NumberBitwiseOp('|', 1, 2), 1 | 2);
+		t.equal(ES.NumberBitwiseOp('^', 1, 2), 1 ^ 2);
+
+		t.end();
+	});
+
+	test('ToNumeric', function (t) {
+		testToNumber(t, ES, ES.ToNumeric);
+
+		t.test('BigInts', { skip: !hasBigInts }, function (st) {
+			st.equal(ES.ToNumeric(BigInt(42)), BigInt(42), debug(BigInt(42)) + ' is ' + debug(BigInt(42)));
+			st.equal(ES.ToNumeric(Object(BigInt(42))), BigInt(42), debug(Object(BigInt(42))) + ' is ' + debug(BigInt(42)));
+
+			var valueOf = { valueOf: function () { return BigInt(7); } };
+			st.equal(ES.ToNumeric(valueOf), valueOf.valueOf(), debug(valueOf) + ' is ' + debug(valueOf.valueOf()));
+
+			var toPrimitive = {};
+			var value = BigInt(-2);
+			toPrimitive[Symbol.toPrimitive] = function () { return value; };
+			st.equal(ES.ToNumeric(toPrimitive), value, debug(toPrimitive) + ' is ' + debug(value));
+
+			st.end();
+		});
+
+		t.end();
+	});
+
+	test('UTF16DecodeString', function (t) {
+		forEach(v.nonStrings, function (nonString) {
+			t['throws'](
+				function () { ES.UTF16DecodeString(nonString); },
+				TypeError,
+				debug(nonString) + ' is not a String'
+			);
+		});
+
+		t.deepEqual(ES.UTF16DecodeString('abc'), ['a', 'b', 'c'], 'code units get split');
+		t.deepEqual(ES.UTF16DecodeString('a' + wholePoo + 'c'), ['a', wholePoo, 'c'], 'code points get split too');
+
+		t.end();
+	});
+};
+
+module.exports = {
+	es5: es5,
+	es2015: es2015,
+	es2016: es2016,
+	es2017: es2017,
+	es2018: es2018,
+	es2019: es2019,
+	es2020: es2020
+};