diff --git a/kotlin/all-your-base/.gradle/4.0.2/fileChanges/last-build.bin b/kotlin/all-your-base/.gradle/4.0.2/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/all-your-base/.gradle/4.0.2/fileChanges/last-build.bin differ
diff --git a/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.bin b/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..87c776a
Binary files /dev/null and b/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.bin differ
diff --git a/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.lock b/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..5deaf50
Binary files /dev/null and b/kotlin/all-your-base/.gradle/4.0.2/fileHashes/fileHashes.lock differ
diff --git a/kotlin/all-your-base/.gradle/buildOutputCleanup/built.bin b/kotlin/all-your-base/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties b/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..de8a908
--- /dev/null
+++ b/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Thu Aug 03 18:33:18 EDT 2017
+gradle.version=4.0.2
diff --git a/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/all-your-base/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/compiler.xml b/kotlin/all-your-base/.idea/compiler.xml
new file mode 100644
index 0000000..005c1c3
--- /dev/null
+++ b/kotlin/all-your-base/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/gradle.xml b/kotlin/all-your-base/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/all-your-base/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/all-your-base/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/all-your-base/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/all-your-base/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/misc.xml b/kotlin/all-your-base/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/all-your-base/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/modules.xml b/kotlin/all-your-base/.idea/modules.xml
new file mode 100644
index 0000000..a5a7185
--- /dev/null
+++ b/kotlin/all-your-base/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/modules/all-your-base_main.iml b/kotlin/all-your-base/.idea/modules/all-your-base_main.iml
new file mode 100644
index 0000000..eb5a1e8
--- /dev/null
+++ b/kotlin/all-your-base/.idea/modules/all-your-base_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/modules/all-your-base_test.iml b/kotlin/all-your-base/.idea/modules/all-your-base_test.iml
new file mode 100644
index 0000000..ec039b3
--- /dev/null
+++ b/kotlin/all-your-base/.idea/modules/all-your-base_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/.idea/workspace.xml b/kotlin/all-your-base/.idea/workspace.xml
new file mode 100644
index 0000000..1130ffc
--- /dev/null
+++ b/kotlin/all-your-base/.idea/workspace.xml
@@ -0,0 +1,773 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Ignore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501799584240
+
+
+ 1501799584240
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/README.md b/kotlin/all-your-base/README.md
new file mode 100644
index 0000000..69cae11
--- /dev/null
+++ b/kotlin/all-your-base/README.md
@@ -0,0 +1,38 @@
+# All Your Base
+
+Convert a number, represented as a sequence of digits in one base, to any other base.
+
+Implement general base conversion. Given a number in base **a**,
+represented as a sequence of digits, convert it to base **b**.
+
+## Note
+- Try to implement the conversion yourself.
+ Do not use something else to perform the conversion for you.
+
+## About [Positional Notation](https://en.wikipedia.org/wiki/Positional_notation)
+
+In positional notation, a number in base **b** can be understood as a linear
+combination of powers of **b**.
+
+The number 42, *in base 10*, means:
+
+(4 * 10^1) + (2 * 10^0)
+
+The number 101010, *in base 2*, means:
+
+(1 * 2^5) + (0 * 2^4) + (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (0 * 2^0)
+
+The number 1120, *in base 3*, means:
+
+(1 * 3^3) + (1 * 3^2) + (2 * 3^1) + (0 * 3^0)
+
+I think you got the idea!
+
+
+*Yes. Those three numbers above are exactly the same. Congratulations!*
+
+
+
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/all-your-base/all-your-base.iml b/kotlin/all-your-base/all-your-base.iml
new file mode 100644
index 0000000..60969be
--- /dev/null
+++ b/kotlin/all-your-base/all-your-base.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/all-your-base/build.gradle b/kotlin/all-your-base/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/all-your-base/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/all-your-base/src/main/kotlin/.keep b/kotlin/all-your-base/src/main/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/all-your-base/src/test/kotlin/BaseConverterTest.kt b/kotlin/all-your-base/src/test/kotlin/BaseConverterTest.kt
new file mode 100644
index 0000000..8930189
--- /dev/null
+++ b/kotlin/all-your-base/src/test/kotlin/BaseConverterTest.kt
@@ -0,0 +1,250 @@
+import org.junit.Assert.assertArrayEquals
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.ExpectedException
+import java.util.*
+
+/*
+ * version: 1.0.0
+ */
+class BaseConverterTest {
+
+ /*
+ * See https://github.com/junit-team/junit4/wiki/Rules for information on JUnit Rules in general and
+ * ExpectedExceptions in particular.
+ */
+ @Rule @JvmField
+ var expectedException: ExpectedException = ExpectedException.none()
+
+ @Test
+ fun testSingleBitOneToDecimal() {
+ val baseConverter = BaseConverter(2, intArrayOf(1))
+
+ val expectedDigits = intArrayOf(1)
+ val actualDigits = baseConverter.convertToBase(10)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testBinaryToSingleDecimal() {
+ val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1))
+
+ val expectedDigits = intArrayOf(5)
+ val actualDigits = baseConverter.convertToBase(10)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testSingleDecimalToBinary() {
+ val baseConverter = BaseConverter(10, intArrayOf(5))
+
+ val expectedDigits = intArrayOf(1, 0, 1)
+ val actualDigits = baseConverter.convertToBase(2)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testBinaryToMultipleDecimal() {
+ val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
+
+ val expectedDigits = intArrayOf(4, 2)
+ val actualDigits = baseConverter.convertToBase(10)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testDecimalToBinary() {
+ val baseConverter = BaseConverter(10, intArrayOf(4, 2))
+
+ val expectedDigits = intArrayOf(1, 0, 1, 0, 1, 0)
+ val actualDigits = baseConverter.convertToBase(2)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testTrinaryToHexadecimal() {
+ val baseConverter = BaseConverter(3, intArrayOf(1, 1, 2, 0))
+
+ val expectedDigits = intArrayOf(2, 10)
+ val actualDigits = baseConverter.convertToBase(16)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testHexadecimalToTrinary() {
+ val baseConverter = BaseConverter(16, intArrayOf(2, 10))
+
+ val expectedDigits = intArrayOf(1, 1, 2, 0)
+ val actualDigits = baseConverter.convertToBase(3)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun test15BitInteger() {
+ val baseConverter = BaseConverter(97, intArrayOf(3, 46, 60))
+
+ val expectedDigits = intArrayOf(6, 10, 45)
+ val actualDigits = baseConverter.convertToBase(73)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testEmptyDigits() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("You must supply at least one digit.")
+
+ BaseConverter(2, intArrayOf())
+ }
+
+
+ @Test
+ fun testSingleZero() {
+ val baseConverter = BaseConverter(10, intArrayOf(0))
+
+ val expectedDigits = intArrayOf(0)
+ val actualDigits = baseConverter.convertToBase(2)
+
+ assertArrayEquals(
+ "Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
+ expectedDigits,
+ actualDigits)
+ }
+
+
+ @Test
+ fun testMultipleZeros() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Digits may not contain leading zeros.")
+
+ BaseConverter(10, intArrayOf(0, 0, 0))
+ }
+
+
+ @Test
+ fun testLeadingZeros() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Digits may not contain leading zeros.")
+
+ BaseConverter(7, intArrayOf(0, 6, 0))
+ }
+
+
+ @Test
+ fun testNegativeDigit() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Digits may not be negative.")
+
+ BaseConverter(2, intArrayOf(1, -1, 1, 0, 1, 0))
+ }
+
+
+ @Test
+ fun testInvalidPositiveDigit() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("All digits must be strictly less than the base.")
+
+ BaseConverter(2, intArrayOf(1, 2, 1, 0, 1, 0))
+ }
+
+
+ @Test
+ fun testFirstBaseIsOne() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ BaseConverter(1, intArrayOf())
+ }
+
+
+ @Test
+ fun testSecondBaseIsOne() {
+ val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
+
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ baseConverter.convertToBase(1)
+ }
+
+
+ @Test
+ fun testFirstBaseIsZero() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ BaseConverter(0, intArrayOf())
+ }
+
+
+ @Test
+ fun testSecondBaseIsZero() {
+ val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
+
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ baseConverter.convertToBase(0)
+ }
+
+
+ @Test
+ fun testFirstBaseIsNegative() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ BaseConverter(-2, intArrayOf())
+ }
+
+
+ @Test
+ fun testSecondBaseIsNegative() {
+ val baseConverter = BaseConverter(2, intArrayOf(1))
+
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Bases must be at least 2.")
+
+ baseConverter.convertToBase(-7)
+ }
+
+}
diff --git a/kotlin/binary-search/.gradle/4.0.1/fileChanges/last-build.bin b/kotlin/binary-search/.gradle/4.0.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/binary-search/.gradle/4.0.1/fileChanges/last-build.bin differ
diff --git a/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.bin b/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..6e83f8d
Binary files /dev/null and b/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.bin differ
diff --git a/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.lock b/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..20ad88f
Binary files /dev/null and b/kotlin/binary-search/.gradle/4.0.1/fileHashes/fileHashes.lock differ
diff --git a/kotlin/binary-search/.gradle/buildOutputCleanup/built.bin b/kotlin/binary-search/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties b/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..67a1e9f
--- /dev/null
+++ b/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Wed Aug 02 12:07:58 EDT 2017
+gradle.version=4.0.1
diff --git a/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/binary-search/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/compiler.xml b/kotlin/binary-search/.idea/compiler.xml
new file mode 100644
index 0000000..54a0ee2
--- /dev/null
+++ b/kotlin/binary-search/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/gradle.xml b/kotlin/binary-search/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/binary-search/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/binary-search/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/binary-search/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/binary-search/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/misc.xml b/kotlin/binary-search/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/binary-search/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/modules.xml b/kotlin/binary-search/.idea/modules.xml
new file mode 100644
index 0000000..d333fa2
--- /dev/null
+++ b/kotlin/binary-search/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/modules/binary-search_main.iml b/kotlin/binary-search/.idea/modules/binary-search_main.iml
new file mode 100644
index 0000000..32564de
--- /dev/null
+++ b/kotlin/binary-search/.idea/modules/binary-search_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/modules/binary-search_test.iml b/kotlin/binary-search/.idea/modules/binary-search_test.iml
new file mode 100644
index 0000000..11b0825
--- /dev/null
+++ b/kotlin/binary-search/.idea/modules/binary-search_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/.idea/workspace.xml b/kotlin/binary-search/.idea/workspace.xml
new file mode 100644
index 0000000..34791e5
--- /dev/null
+++ b/kotlin/binary-search/.idea/workspace.xml
@@ -0,0 +1,754 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Ignore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501690075439
+
+
+ 1501690075439
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/README.md b/kotlin/binary-search/README.md
new file mode 100644
index 0000000..bf48e19
--- /dev/null
+++ b/kotlin/binary-search/README.md
@@ -0,0 +1,44 @@
+# Binary Search
+
+Implement a binary search algorithm.
+
+Searching a sorted collection is a common task. A dictionary is a sorted
+list of word definitions. Given a word, one can find its definition. A
+telephone book is a sorted list of people's names, addresses, and
+telephone numbers. Knowing someone's name allows one to quickly find
+their telephone number and address.
+
+If the list to be searched contains more than a few items (a dozen, say)
+a binary search will require far fewer comparisons than a linear search,
+but it imposes the requirement that the list be sorted.
+
+In computer science, a binary search or half-interval search algorithm
+finds the position of a specified input value (the search "key") within
+an array sorted by key value.
+
+In each step, the algorithm compares the search key value with the key
+value of the middle element of the array.
+
+If the keys match, then a matching element has been found and its index,
+or position, is returned.
+
+Otherwise, if the search key is less than the middle element's key, then
+the algorithm repeats its action on the sub-array to the left of the
+middle element or, if the search key is greater, on the sub-array to the
+right.
+
+If the remaining array to be searched is empty, then the key cannot be
+found in the array and a special "not found" indication is returned.
+
+A binary search halves the number of items to check with each iteration,
+so locating an item (or determining its absence) takes logarithmic time.
+A binary search is a dichotomic divide and conquer search algorithm.
+
+
+
+## Source
+
+Wikipedia [http://en.wikipedia.org/wiki/Binary_search_algorithm](http://en.wikipedia.org/wiki/Binary_search_algorithm)
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/binary-search/binary-search.iml b/kotlin/binary-search/binary-search.iml
new file mode 100644
index 0000000..290bdf6
--- /dev/null
+++ b/kotlin/binary-search/binary-search.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/binary-search/build.gradle b/kotlin/binary-search/build.gradle
new file mode 100644
index 0000000..968d78a
--- /dev/null
+++ b/kotlin/binary-search/build.gradle
@@ -0,0 +1,29 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/binary-search/src/main/kotlin/.keep b/kotlin/binary-search/src/main/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/binary-search/src/test/kotlin/BinarySearchTest.kt b/kotlin/binary-search/src/test/kotlin/BinarySearchTest.kt
new file mode 100644
index 0000000..da982a3
--- /dev/null
+++ b/kotlin/binary-search/src/test/kotlin/BinarySearchTest.kt
@@ -0,0 +1,54 @@
+
+import org.junit.Test
+import org.junit.Ignore
+import kotlin.test.assertEquals
+
+class BinarySearchTest {
+
+
+ @Test(expected = IllegalArgumentException::class)
+ fun unsortedListCannotBeSearched() {
+ BinarySearch.search(listOf(1, 2, 4, 3), 1)
+ }
+
+ @Test
+ fun shouldReturnMinus1ForAValueNotPresentInTheList() {
+ assertEquals(-1, BinarySearch.search(listOf(1, 2, 3, 4), 5))
+ }
+
+
+ @Test
+ fun shouldFindTheItemInASingleElementList() {
+ assertEquals(0, BinarySearch.search(listOf(3), 3))
+ }
+
+
+ @Test
+ fun shouldFindTheFirstItemInATwoElementList() {
+ assertEquals(0, BinarySearch.search(listOf(4, 11), 4))
+ }
+
+
+ @Test
+ fun shouldFindTheLastItemInATwoElementList() {
+ assertEquals(1, BinarySearch.search(listOf(4, 11), 11))
+ }
+
+
+ @Test
+ fun shouldFindTheMidItemInAnOddLengthList() {
+ assertEquals(2, BinarySearch.search(listOf(4, 4, 7, 9, 11), 7))
+ }
+
+
+ @Test
+ fun shouldFindThePreMidItemInAnEvenLengthList() {
+ assertEquals(1, BinarySearch.search(listOf(4, 5, 9, 11), 5))
+ }
+
+
+ @Test
+ fun shouldFindThePostMidItemInAnEvenLengthList() {
+ assertEquals(2, BinarySearch.search(listOf(4, 5, 17, 29), 17))
+ }
+}
\ No newline at end of file
diff --git a/kotlin/linked-list/.gradle/4.0.1/fileChanges/last-build.bin b/kotlin/linked-list/.gradle/4.0.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/linked-list/.gradle/4.0.1/fileChanges/last-build.bin differ
diff --git a/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.bin b/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..3fbbea7
Binary files /dev/null and b/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.bin differ
diff --git a/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.lock b/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..43caa97
Binary files /dev/null and b/kotlin/linked-list/.gradle/4.0.1/fileHashes/fileHashes.lock differ
diff --git a/kotlin/linked-list/.gradle/buildOutputCleanup/built.bin b/kotlin/linked-list/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties b/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..74222e1
--- /dev/null
+++ b/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Tue Aug 01 22:30:55 EDT 2017
+gradle.version=4.0.1
diff --git a/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/linked-list/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/compiler.xml b/kotlin/linked-list/.idea/compiler.xml
new file mode 100644
index 0000000..6427271
--- /dev/null
+++ b/kotlin/linked-list/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/gradle.xml b/kotlin/linked-list/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/linked-list/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/linked-list/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/linked-list/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/linked-list/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/misc.xml b/kotlin/linked-list/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/linked-list/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/modules.xml b/kotlin/linked-list/.idea/modules.xml
new file mode 100644
index 0000000..28c0cd7
--- /dev/null
+++ b/kotlin/linked-list/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/modules/linked-list_main.iml b/kotlin/linked-list/.idea/modules/linked-list_main.iml
new file mode 100644
index 0000000..96f79ff
--- /dev/null
+++ b/kotlin/linked-list/.idea/modules/linked-list_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/modules/linked-list_test.iml b/kotlin/linked-list/.idea/modules/linked-list_test.iml
new file mode 100644
index 0000000..542f06d
--- /dev/null
+++ b/kotlin/linked-list/.idea/modules/linked-list_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/.idea/workspace.xml b/kotlin/linked-list/.idea/workspace.xml
new file mode 100644
index 0000000..4acc233
--- /dev/null
+++ b/kotlin/linked-list/.idea/workspace.xml
@@ -0,0 +1,769 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501641053094
+
+
+ 1501641053094
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/README.md b/kotlin/linked-list/README.md
new file mode 100644
index 0000000..420ba7f
--- /dev/null
+++ b/kotlin/linked-list/README.md
@@ -0,0 +1,37 @@
+# Linked List
+
+Implement a doubly linked list.
+
+Like an array, a linked list is a simple linear data structure. Several
+common data types can be implemented using linked lists, like queues,
+stacks, and associative arrays.
+
+A linked list is a collection of data elements called *nodes*. In a
+*singly linked list* each node holds a value and a link to the next node.
+In a *doubly linked list* each node also holds a link to the previous
+node.
+
+You will write an implementation of a doubly linked list. Implement a
+Node to hold a value and pointers to the next and previous nodes. Then
+implement a List which holds references to the first and last node and
+offers an array-like interface for adding and removing items:
+
+* `push` (*insert value at back*);
+* `pop` (*remove value at back*);
+* `shift` (*remove value at front*).
+* `unshift` (*insert value at front*);
+
+To keep your implementation simple, the tests will not cover error
+conditions. Specifically: `pop` or `shift` will never be called on an
+empty list.
+
+If you want to know more about linked lists, check [Wikipedia](https://en.wikipedia.org/wiki/Linked_list).
+
+
+
+## Source
+
+Classic computer science topic
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/linked-list/build.gradle b/kotlin/linked-list/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/linked-list/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/linked-list/linked-list.iml b/kotlin/linked-list/linked-list.iml
new file mode 100644
index 0000000..b4f74b4
--- /dev/null
+++ b/kotlin/linked-list/linked-list.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/linked-list/src/main/kotlin/.keep b/kotlin/linked-list/src/main/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/linked-list/src/test/kotlin/DequeTest.kt b/kotlin/linked-list/src/test/kotlin/DequeTest.kt
new file mode 100644
index 0000000..3b4f3b1
--- /dev/null
+++ b/kotlin/linked-list/src/test/kotlin/DequeTest.kt
@@ -0,0 +1,62 @@
+import org.junit.Before
+import org.junit.Test
+import org.junit.Ignore
+import kotlin.test.assertEquals
+
+class DequeTest {
+ private lateinit var subject: Deque
+
+ @Before
+ fun setUp() {
+ subject = Deque()
+ }
+
+
+ @Test
+ fun pushPop() {
+ subject.push(10)
+ subject.push(20)
+ assertEquals(20, subject.pop())
+ assertEquals(10, subject.pop())
+ }
+
+ @Test
+ fun pushShift() {
+ subject.push(10)
+ subject.push(20)
+ assertEquals(10, subject.shift())
+ assertEquals(20, subject.shift())
+ }
+
+ @Test
+ fun unshiftShift() {
+ subject.unshift(10)
+ subject.unshift(20)
+ assertEquals(20, subject.shift())
+ assertEquals(10, subject.shift())
+ }
+
+ @Test
+ fun unshiftPop() {
+ subject.unshift(10)
+ subject.unshift(20)
+ assertEquals(10, subject.pop())
+ assertEquals(20, subject.pop())
+ }
+
+ @Test
+ fun example() {
+ subject.push(10)
+ subject.push(20)
+ assertEquals(20, subject.pop())
+
+ subject.push(30)
+ assertEquals(10, subject.shift())
+
+ subject.unshift(40)
+ subject.push(50)
+ assertEquals(40, subject.shift())
+ assertEquals(50, subject.pop())
+ assertEquals(30, subject.shift())
+ }
+}
diff --git a/kotlin/minesweeper/.gradle/4.0.1/fileChanges/last-build.bin b/kotlin/minesweeper/.gradle/4.0.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/minesweeper/.gradle/4.0.1/fileChanges/last-build.bin differ
diff --git a/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.bin b/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..c58e01a
Binary files /dev/null and b/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.bin differ
diff --git a/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.lock b/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..c18bc8f
Binary files /dev/null and b/kotlin/minesweeper/.gradle/4.0.1/fileHashes/fileHashes.lock differ
diff --git a/kotlin/minesweeper/.gradle/buildOutputCleanup/built.bin b/kotlin/minesweeper/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties b/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..7945c7b
--- /dev/null
+++ b/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Wed Aug 02 13:27:03 EDT 2017
+gradle.version=4.0.1
diff --git a/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/minesweeper/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/compiler.xml b/kotlin/minesweeper/.idea/compiler.xml
new file mode 100644
index 0000000..1adc722
--- /dev/null
+++ b/kotlin/minesweeper/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/gradle.xml b/kotlin/minesweeper/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/minesweeper/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/minesweeper/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/minesweeper/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/minesweeper/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/misc.xml b/kotlin/minesweeper/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/minesweeper/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/modules.xml b/kotlin/minesweeper/.idea/modules.xml
new file mode 100644
index 0000000..c1b497b
--- /dev/null
+++ b/kotlin/minesweeper/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/modules/minesweeper_main.iml b/kotlin/minesweeper/.idea/modules/minesweeper_main.iml
new file mode 100644
index 0000000..073ac72
--- /dev/null
+++ b/kotlin/minesweeper/.idea/modules/minesweeper_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/modules/minesweeper_test.iml b/kotlin/minesweeper/.idea/modules/minesweeper_test.iml
new file mode 100644
index 0000000..9cf0f8d
--- /dev/null
+++ b/kotlin/minesweeper/.idea/modules/minesweeper_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/.idea/workspace.xml b/kotlin/minesweeper/.idea/workspace.xml
new file mode 100644
index 0000000..470266d
--- /dev/null
+++ b/kotlin/minesweeper/.idea/workspace.xml
@@ -0,0 +1,805 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Ignore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501694821817
+
+
+ 1501694821817
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/src/test/kotlin/MinesweeperBoardTest.kt
+ 136
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/README.md b/kotlin/minesweeper/README.md
new file mode 100644
index 0000000..63b9a91
--- /dev/null
+++ b/kotlin/minesweeper/README.md
@@ -0,0 +1,33 @@
+# Minesweeper
+
+Add the numbers to a minesweeper board.
+
+Minesweeper is a popular game where the user has to find the mines using
+numeric hints that indicate how many mines are directly adjacent
+(horizontally, vertically, diagonally) to a square.
+
+In this exercise you have to create some code that counts the number of
+mines adjacent to a square and transforms boards like this (where `*`
+indicates a mine):
+
+ +-----+
+ | * * |
+ | * |
+ | * |
+ | |
+ +-----+
+
+into this:
+
+ +-----+
+ |1*3*1|
+ |13*31|
+ | 2*2 |
+ | 111 |
+ +-----+
+
+
+
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/minesweeper/build.gradle b/kotlin/minesweeper/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/minesweeper/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/minesweeper/minesweeper.iml b/kotlin/minesweeper/minesweeper.iml
new file mode 100644
index 0000000..b3b6a03
--- /dev/null
+++ b/kotlin/minesweeper/minesweeper.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/minesweeper/src/main/kotlin/.keep b/kotlin/minesweeper/src/main/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/minesweeper/src/test/kotlin/MinesweeperBoardTest.kt b/kotlin/minesweeper/src/test/kotlin/MinesweeperBoardTest.kt
new file mode 100644
index 0000000..edcc9c1
--- /dev/null
+++ b/kotlin/minesweeper/src/test/kotlin/MinesweeperBoardTest.kt
@@ -0,0 +1,240 @@
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.ExpectedException
+import kotlin.test.assertEquals
+
+/*
+ * version: 1.0.0
+ */
+class MinesweeperBoardTest {
+
+ /*
+ * See https://github.com/junit-team/junit4/wiki/Rules for information on JUnit Rules in general and
+ * ExpectedExceptions in particular.
+ */
+ @Rule
+ @JvmField
+ var expectedException: ExpectedException = ExpectedException.none()
+
+ @Test
+ fun testInputBoardWithNoRowsAndNoColumns() {
+ val inputBoard = emptyList()
+ val expectedNumberedBoard = emptyList()
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithOneRowAndNoColumns() {
+ val inputBoard = listOf("")
+ val expectedNumberedBoard = listOf("")
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithNoMines() {
+ val inputBoard = listOf(
+ " ",
+ " ",
+ " "
+ )
+
+ val expectedNumberedBoard = listOf(
+ " ",
+ " ",
+ " "
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithOnlyMines() {
+ val inputBoard = listOf(
+ "***",
+ "***",
+ "***"
+ )
+
+ val expectedNumberedBoard = listOf(
+ "***",
+ "***",
+ "***"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+ @Test
+ fun testInputBoardWithSingleMineAtCenter() {
+ val inputBoard = listOf(
+ " ",
+ " * ",
+ " "
+ )
+
+ val expectedNumberedBoard = listOf(
+ "111",
+ "1*1",
+ "111"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithMinesAroundPerimeter() {
+ val inputBoard = listOf(
+ "***",
+ "* *",
+ "***"
+ )
+
+ val expectedNumberedBoard = listOf(
+ "***",
+ "*8*",
+ "***"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithSingleRowAndTwoMines() {
+ val inputBoard = listOf(" * * ")
+
+ val expectedNumberedBoard = listOf("1*2*1")
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithSingleRowAndTwoMinesAtEdges() {
+ val inputBoard = listOf("* *")
+
+ val expectedNumberedBoard = listOf("*1 1*")
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithSingleColumnAndTwoMines() {
+ val inputBoard = listOf(
+ " ",
+ "*",
+ " ",
+ "*",
+ " "
+ )
+
+ val expectedNumberedBoard = listOf(
+ "1",
+ "*",
+ "2",
+ "*",
+ "1"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithSingleColumnAndTwoMinesAtEdges() {
+ val inputBoard = listOf(
+ "*",
+ " ",
+ " ",
+ " ",
+ "*"
+ )
+
+ val expectedNumberedBoard = listOf(
+ "*",
+ "1",
+ " ",
+ "1",
+ "*"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testInputBoardWithMinesInCross() {
+ val inputBoard = listOf(
+ " * ",
+ " * ",
+ "*****",
+ " * ",
+ " * "
+ )
+
+ val expectedNumberedBoard = listOf(
+ " 2*2 ",
+ "25*52",
+ "*****",
+ "25*52",
+ " 2*2 "
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+
+ @Test
+ fun testLargeInputBoard() {
+ val inputBoard = listOf(
+ " * * ",
+ " * ",
+ " * ",
+ " * *",
+ " * * ",
+ " "
+ )
+
+ val expectedNumberedBoard = listOf(
+ "1*22*1",
+ "12*322",
+ " 123*2",
+ "112*4*",
+ "1*22*2",
+ "111111"
+ )
+
+ val actualNumberedBoard = MinesweeperBoard(inputBoard).withNumbers()
+
+ assertEquals(expectedNumberedBoard, actualNumberedBoard)
+ }
+
+}
diff --git a/kotlin/pig-latin/.gitignore b/kotlin/pig-latin/.gitignore
new file mode 100644
index 0000000..573c62a
--- /dev/null
+++ b/kotlin/pig-latin/.gitignore
@@ -0,0 +1,180 @@
+# Created by .ignore support plugin (hsz.mobi)
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff:
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/dictionaries
+
+# Sensitive or high-churn files:
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.xml
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+
+# Gradle:
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Mongo Explorer plugin:
+.idea/**/mongoSettings.xml
+
+## File-based project format:
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+### Python template
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# dotenv
+.env
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+
+# Rope project settings
+.ropeproject
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+### Elixir template
+/_build
+/cover
+/deps
+erl_crash.dump
+*.ez
+*.beam
+### Rust template
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
diff --git a/kotlin/robot-simulator/.gradle/4.0.1/fileChanges/last-build.bin b/kotlin/robot-simulator/.gradle/4.0.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/robot-simulator/.gradle/4.0.1/fileChanges/last-build.bin differ
diff --git a/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.bin b/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..765e70a
Binary files /dev/null and b/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.bin differ
diff --git a/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.lock b/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..f3a0181
Binary files /dev/null and b/kotlin/robot-simulator/.gradle/4.0.1/fileHashes/fileHashes.lock differ
diff --git a/kotlin/robot-simulator/.gradle/buildOutputCleanup/built.bin b/kotlin/robot-simulator/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties b/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..ae4581c
--- /dev/null
+++ b/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Wed Aug 02 11:53:51 EDT 2017
+gradle.version=4.0.1
diff --git a/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/robot-simulator/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/compiler.xml b/kotlin/robot-simulator/.idea/compiler.xml
new file mode 100644
index 0000000..5aaf360
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/gradle.xml b/kotlin/robot-simulator/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/misc.xml b/kotlin/robot-simulator/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/modules.xml b/kotlin/robot-simulator/.idea/modules.xml
new file mode 100644
index 0000000..fe215b8
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/modules/robot-simulator_main.iml b/kotlin/robot-simulator/.idea/modules/robot-simulator_main.iml
new file mode 100644
index 0000000..e88f439
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/modules/robot-simulator_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/modules/robot-simulator_test.iml b/kotlin/robot-simulator/.idea/modules/robot-simulator_test.iml
new file mode 100644
index 0000000..e6f30d3
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/modules/robot-simulator_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/.idea/workspace.xml b/kotlin/robot-simulator/.idea/workspace.xml
new file mode 100644
index 0000000..762f396
--- /dev/null
+++ b/kotlin/robot-simulator/.idea/workspace.xml
@@ -0,0 +1,772 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Ignore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501689229115
+
+
+ 1501689229115
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/README.md b/kotlin/robot-simulator/README.md
new file mode 100644
index 0000000..2b7e556
--- /dev/null
+++ b/kotlin/robot-simulator/README.md
@@ -0,0 +1,37 @@
+# Robot Simulator
+
+Write a robot simulator.
+
+A robot factory's test facility needs a program to verify robot movements.
+
+The robots have three possible movements:
+
+- turn right
+- turn left
+- advance
+
+Robots are placed on a hypothetical infinite grid, facing a particular
+direction (north, east, south, or west) at a set of {x,y} coordinates,
+e.g., {3,8}, with coordinates increasing to the north and east.
+
+The robot then receives a number of instructions, at which point the
+testing facility verifies the robot's new position, and in which
+direction it is pointing.
+
+- The letter-string "RAALAL" means:
+ - Turn right
+ - Advance twice
+ - Turn left
+ - Advance once
+ - Turn left yet again
+- Say a robot starts at {7, 3} facing north. Then running this stream
+ of instructions should leave it at {9, 4} facing west.
+
+
+
+## Source
+
+Inspired by an interview question at a famous company.
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/robot-simulator/build.gradle b/kotlin/robot-simulator/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/robot-simulator/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/robot-simulator/robot-simulator.iml b/kotlin/robot-simulator/robot-simulator.iml
new file mode 100644
index 0000000..354b777
--- /dev/null
+++ b/kotlin/robot-simulator/robot-simulator.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/robot-simulator/src/main/kotlin/GridPosition.kt b/kotlin/robot-simulator/src/main/kotlin/GridPosition.kt
new file mode 100644
index 0000000..211aa56
--- /dev/null
+++ b/kotlin/robot-simulator/src/main/kotlin/GridPosition.kt
@@ -0,0 +1 @@
+data class GridPosition(val x: Int, val y: Int)
diff --git a/kotlin/robot-simulator/src/main/kotlin/Orientation.kt b/kotlin/robot-simulator/src/main/kotlin/Orientation.kt
new file mode 100644
index 0000000..2821eb9
--- /dev/null
+++ b/kotlin/robot-simulator/src/main/kotlin/Orientation.kt
@@ -0,0 +1,5 @@
+enum class Orientation {
+
+ NORTH, EAST, SOUTH, WEST
+
+}
diff --git a/kotlin/robot-simulator/src/starterSource/kotlin/.keep b/kotlin/robot-simulator/src/starterSource/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/robot-simulator/src/test/kotlin/RobotTest.kt b/kotlin/robot-simulator/src/test/kotlin/RobotTest.kt
new file mode 100644
index 0000000..0e6780a
--- /dev/null
+++ b/kotlin/robot-simulator/src/test/kotlin/RobotTest.kt
@@ -0,0 +1,213 @@
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+/*
+ * version: 1.0.0
+ */
+class RobotTest {
+
+ @Test
+ fun testRobotIsCreatedWithCorrectPositionAndOrientationByDefault() {
+ val robot = Robot()
+
+ assertEquals(GridPosition(x = 0, y = 0), robot.gridPosition)
+ assertEquals(Orientation.NORTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testRobotCanBeCreatedWithCustomPositionAndOrientation() {
+ val robot = Robot(GridPosition(x = -1, y = -1), Orientation.SOUTH)
+
+ assertEquals(GridPosition(x = -1, y = -1), robot.gridPosition)
+ assertEquals(Orientation.SOUTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningRightDoesNotChangePosition() {
+ val initialGridPosition = GridPosition(x = 0, y = 0)
+ val robot = Robot(initialGridPosition, Orientation.NORTH)
+
+ robot.turnRight()
+
+ assertEquals(initialGridPosition, robot.gridPosition)
+ }
+
+
+ @Test
+ fun testTurningRightCorrectlyChangesOrientationFromNorthToEast() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.NORTH)
+
+ robot.turnRight()
+
+ assertEquals(Orientation.EAST, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningRightCorrectlyChangesOrientationFromEastToSouth() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.EAST)
+
+ robot.turnRight()
+
+ assertEquals(Orientation.SOUTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningRightCorrectlyChangesOrientationFromSouthToWest() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.SOUTH)
+
+ robot.turnRight()
+
+ assertEquals(Orientation.WEST, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningRightCorrectlyChangesOrientationFromWestToNorth() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.WEST)
+
+ robot.turnRight()
+
+ assertEquals(Orientation.NORTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningLeftDoesNotChangePosition() {
+ val initialGridPosition = GridPosition(x = 0, y = 0)
+ val robot = Robot(initialGridPosition, Orientation.NORTH)
+
+ robot.turnLeft()
+
+ assertEquals(initialGridPosition, robot.gridPosition)
+ }
+
+
+ @Test
+ fun testTurningLeftCorrectlyChangesOrientationFromNorthToWest() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.NORTH)
+
+ robot.turnLeft()
+
+ assertEquals(Orientation.WEST, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningLeftCorrectlyChangesOrientationFromWestToSouth() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.WEST)
+
+ robot.turnLeft()
+
+ assertEquals(Orientation.SOUTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningLeftCorrectlyChangesOrientationFromSouthToEast() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.SOUTH)
+
+ robot.turnLeft()
+
+ assertEquals(Orientation.EAST, robot.orientation)
+ }
+
+
+ @Test
+ fun testTurningLeftCorrectlyChangesOrientationFromEastToNorth() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.EAST)
+
+ robot.turnLeft()
+
+ assertEquals(Orientation.NORTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testAdvancingDoesNotChangeOrientation() {
+ val initialOrientation = Orientation.NORTH
+ val robot = Robot(GridPosition(x = 0, y = 0), initialOrientation)
+
+ robot.advance()
+
+ assertEquals(initialOrientation, robot.orientation)
+ }
+
+
+ @Test
+ fun testAdvancingWhenFacingNorthIncreasesYCoordinateByOne() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.NORTH)
+
+ robot.advance()
+
+ assertEquals(GridPosition(x = 0, y = 1), robot.gridPosition)
+ }
+
+
+ @Test
+ fun testAdvancingWhenFacingSouthDecreasesYCoordinateByOne() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.SOUTH)
+
+ robot.advance()
+
+ assertEquals(GridPosition(x = 0, y = -1), robot.gridPosition)
+ }
+
+
+ @Test
+ fun testAdvancingWhenFacingEastIncreasesXCoordinateByOne() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.EAST)
+
+ robot.advance()
+
+ assertEquals(GridPosition(x = 1, y = 0), robot.gridPosition)
+ }
+
+
+ @Test
+ fun testAdvancingWhenFacingWestDecreasesXCoordinateByOne() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.WEST)
+
+ robot.advance()
+
+ assertEquals(GridPosition(x = -1, y = 0), robot.gridPosition)
+ }
+
+
+ @Test
+ fun testInstructionsToMoveWestAndNorth() {
+ val robot = Robot(GridPosition(x = 0, y = 0), Orientation.NORTH)
+
+ robot.simulate("LAAARALA")
+
+ assertEquals(GridPosition(x = -4, y = 1), robot.gridPosition)
+ assertEquals(Orientation.WEST, robot.orientation)
+ }
+
+
+ @Test
+ fun testInstructionsToMoveWestAndSouth() {
+ val robot = Robot(GridPosition(x = 2, y = -7), Orientation.EAST)
+
+ robot.simulate("RRAAAAALA")
+
+ assertEquals(GridPosition(x = -3, y = -8), robot.gridPosition)
+ assertEquals(Orientation.SOUTH, robot.orientation)
+ }
+
+
+ @Test
+ fun testInstructionsToMoveEastAndNorth() {
+ val robot = Robot(GridPosition(x = 8, y = 4), Orientation.SOUTH)
+
+ robot.simulate("LAAARRRALLLL")
+
+ assertEquals(GridPosition(x = 11, y = 5), robot.gridPosition)
+ assertEquals(Orientation.NORTH, robot.orientation)
+ }
+
+}
diff --git a/kotlin/roman-numerals/.gradle/4.0.1/fileChanges/last-build.bin b/kotlin/roman-numerals/.gradle/4.0.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/roman-numerals/.gradle/4.0.1/fileChanges/last-build.bin differ
diff --git a/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.bin b/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..c066568
Binary files /dev/null and b/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.bin differ
diff --git a/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.lock b/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..579d633
Binary files /dev/null and b/kotlin/roman-numerals/.gradle/4.0.1/fileHashes/fileHashes.lock differ
diff --git a/kotlin/roman-numerals/.gradle/buildOutputCleanup/built.bin b/kotlin/roman-numerals/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties b/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..7cff3ca
--- /dev/null
+++ b/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Tue Aug 01 22:15:35 EDT 2017
+gradle.version=4.0.1
diff --git a/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/roman-numerals/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/roman-numerals/roman-numerals.iml b/kotlin/roman-numerals/roman-numerals.iml
new file mode 100644
index 0000000..2e2ddd5
--- /dev/null
+++ b/kotlin/roman-numerals/roman-numerals.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/roman-numerals/roman-numerals.ipr b/kotlin/roman-numerals/roman-numerals.ipr
new file mode 100644
index 0000000..c3f07d8
--- /dev/null
+++ b/kotlin/roman-numerals/roman-numerals.ipr
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/roman-numerals/roman-numerals_main.iml b/kotlin/roman-numerals/roman-numerals_main.iml
new file mode 100644
index 0000000..2ecf7a3
--- /dev/null
+++ b/kotlin/roman-numerals/roman-numerals_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/roman-numerals/roman-numerals_test.iml b/kotlin/roman-numerals/roman-numerals_test.iml
new file mode 100644
index 0000000..1bf991f
--- /dev/null
+++ b/kotlin/roman-numerals/roman-numerals_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.gradle/4.0.2/fileChanges/last-build.bin b/kotlin/say/.gradle/4.0.2/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/say/.gradle/4.0.2/fileChanges/last-build.bin differ
diff --git a/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.bin b/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..6226a40
Binary files /dev/null and b/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.bin differ
diff --git a/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.lock b/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..085e274
Binary files /dev/null and b/kotlin/say/.gradle/4.0.2/fileHashes/fileHashes.lock differ
diff --git a/kotlin/say/.gradle/buildOutputCleanup/built.bin b/kotlin/say/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/say/.gradle/buildOutputCleanup/cache.properties b/kotlin/say/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..a0bb5a97
--- /dev/null
+++ b/kotlin/say/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Thu Aug 03 19:20:46 EDT 2017
+gradle.version=4.0.2
diff --git a/kotlin/say/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/say/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/say/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/compiler.xml b/kotlin/say/.idea/compiler.xml
new file mode 100644
index 0000000..87ab4a7
--- /dev/null
+++ b/kotlin/say/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/gradle.xml b/kotlin/say/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/say/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/say/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/say/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/say/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/misc.xml b/kotlin/say/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/say/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/modules.xml b/kotlin/say/.idea/modules.xml
new file mode 100644
index 0000000..5caf558
--- /dev/null
+++ b/kotlin/say/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/modules/say_main.iml b/kotlin/say/.idea/modules/say_main.iml
new file mode 100644
index 0000000..e7c9496
--- /dev/null
+++ b/kotlin/say/.idea/modules/say_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/modules/say_test.iml b/kotlin/say/.idea/modules/say_test.iml
new file mode 100644
index 0000000..b2231ba
--- /dev/null
+++ b/kotlin/say/.idea/modules/say_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/.idea/workspace.xml b/kotlin/say/.idea/workspace.xml
new file mode 100644
index 0000000..aedb2d6
--- /dev/null
+++ b/kotlin/say/.idea/workspace.xml
@@ -0,0 +1,846 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ forty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501802444445
+
+
+ 1501802444445
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/README.md b/kotlin/say/README.md
new file mode 100644
index 0000000..c3b5c5b
--- /dev/null
+++ b/kotlin/say/README.md
@@ -0,0 +1,72 @@
+# Say
+
+Given a number from 0 to 999,999,999,999, spell out that number in English.
+
+## Step 1
+
+Handle the basic case of 0 through 99.
+
+If the input to the program is `22`, then the output should be
+`'twenty-two'`.
+
+Your program should complain loudly if given a number outside the
+blessed range.
+
+Some good test cases for this program are:
+
+- 0
+- 14
+- 50
+- 98
+- -1
+- 100
+
+### Extension
+
+If you're on a Mac, shell out to Mac OS X's `say` program to talk out
+loud.
+
+## Step 2
+
+Implement breaking a number up into chunks of thousands.
+
+So `1234567890` should yield a list like 1, 234, 567, and 890, while the
+far simpler `1000` should yield just 1 and 0.
+
+The program must also report any values that are out of range.
+
+## Step 3
+
+Now handle inserting the appropriate scale word between those chunks.
+
+So `1234567890` should yield `'1 billion 234 million 567 thousand 890'`
+
+The program must also report any values that are out of range. It's
+fine to stop at "trillion".
+
+## Step 4
+
+Put it all together to get nothing but plain English.
+
+`12345` should give `twelve thousand three hundred forty-five`.
+
+The program must also report any values that are out of range.
+
+### Extensions
+
+Use _and_ (correctly) when spelling out the number in English:
+
+- 14 becomes "fourteen".
+- 100 becomes "one hundred".
+- 120 becomes "one hundred and twenty".
+- 1002 becomes "one thousand and two".
+- 1323 becomes "one thousand three hundred and twenty-three".
+
+
+
+## Source
+
+A variation on JavaRanch CattleDrive, exercise 4a [http://www.javaranch.com/say.jsp](http://www.javaranch.com/say.jsp)
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/say/build.gradle b/kotlin/say/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/say/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/say/say.iml b/kotlin/say/say.iml
new file mode 100644
index 0000000..35aa689
--- /dev/null
+++ b/kotlin/say/say.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/say/src/main/kotlin/.keep b/kotlin/say/src/main/kotlin/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/say/src/main/kotlin/NumberSpeller.kt b/kotlin/say/src/main/kotlin/NumberSpeller.kt
new file mode 100644
index 0000000..7ad3281
--- /dev/null
+++ b/kotlin/say/src/main/kotlin/NumberSpeller.kt
@@ -0,0 +1,90 @@
+class NumberSpeller {
+ fun say(input: Int): String = say(input.toLong())
+
+ fun say(input: Long): String {
+ require(input >= 0) {"Input must be non-negative"}
+ require(input < 1000000000000) {"Input must be less than 1000000000000"}
+
+// return sayHundredDelim(input.toInt()).trim()
+ if (input == 0.toLong()){
+ return "zero"
+ }
+
+ return when (input) {
+ in 0..999 -> sayHundredDelim(inp = input).trim()
+ in 1000..999999 -> sayThousands(inp = input).trim()
+ in 1000000..999999999 -> sayMillions(inp = input).trim()
+ in 1000000000..999999999999 -> sayBillions(inp = input).trim()
+ else -> "How did you get here?"
+ }
+ }
+
+ fun sayHundredDelim(inp: Long): String {
+ val hundreds = inp/100
+ val remainder = inp.rem(100)
+ val stringBuilder = StringBuilder()
+ if (hundreds.toInt() != 0) {
+ stringBuilder.append(sayHundredDelim(hundreds) + " hundred ")
+ }
+
+ stringBuilder.append(
+ when (remainder.toInt()){
+ 0 -> ""
+ 1 -> "one"
+ 2 -> "two"
+ 3 -> "three"
+ 4 -> "four"
+ 5 -> "five"
+ 6 -> "six"
+ 7 -> "seven"
+ 8 -> "eight"
+ 9 -> "nine"
+ 10 -> "ten"
+ 11 -> "eleven"
+ 12 -> "twelve"
+ 13 -> "thirteen"
+ 14 -> "fourteen"
+ 15 -> "fifteen"
+ 16 -> "sixteen"
+ 17 -> "seventeen"
+ 18 -> "eighteen"
+ 19 -> "nineteen"
+ 20 -> "twenty"
+ in 21..29 -> "twenty-" + sayHundredDelim(remainder - 20)
+ 30 -> "thirty"
+ in 31..39 -> "thirty-" + sayHundredDelim(remainder - 30)
+ 40 -> "forty"
+ in 41..49 -> "forty-" + sayHundredDelim(remainder - 40)
+ 50 -> "fifty"
+ in 51..59 -> "fifty-" + sayHundredDelim(remainder - 50)
+ 60 -> "sixty"
+ in 61..69 -> "sixty-" + sayHundredDelim(remainder - 60)
+ 70 -> "seventy"
+ in 71..79 -> "seventy-" + sayHundredDelim(remainder - 70)
+ 80 -> "eighty"
+ in 81..89 -> "eighty-" + sayHundredDelim(remainder - 80)
+ 90 -> "ninety"
+ in 91..99 -> "ninety-" + sayHundredDelim(remainder - 80)
+ else -> "How'd you get here?"
+ })
+ return String(stringBuilder)
+ }
+
+ fun sayThousands(inp: Long): String {
+ if (inp == 0.toLong()){
+ return ""
+ }
+ return sayHundredDelim(inp/1000) + " thousand " + sayHundredDelim(inp.rem(1000))
+ }
+
+ fun sayMillions(inp: Long): String {
+ if (inp == 0.toLong()){
+ return ""
+ }
+ return say(inp/1000000) + " million " + sayThousands(inp.rem(1000000))
+ }
+
+ fun sayBillions(inp: Long): String {
+ return say(inp/1000000000) + " billion " + sayMillions(inp.rem(1000000000))
+ }
+}
\ No newline at end of file
diff --git a/kotlin/say/src/test/kotlin/NumberSpellerTest.kt b/kotlin/say/src/test/kotlin/NumberSpellerTest.kt
new file mode 100644
index 0000000..7b1ab06
--- /dev/null
+++ b/kotlin/say/src/test/kotlin/NumberSpellerTest.kt
@@ -0,0 +1,124 @@
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.ExpectedException
+import java.math.BigInteger
+import kotlin.test.assertEquals
+
+/*
+ * version: 1.0.0
+ */
+class NumberSpellerTest {
+
+ @Rule
+ @JvmField
+ var expectedException: ExpectedException = ExpectedException.none()
+
+ @Test
+ fun test0IsSpelledCorrectly() {
+ assertEquals(
+ "zero",
+ NumberSpeller().say(0))
+ }
+
+ @Test
+ fun test1IsSpelledCorrectly() {
+ assertEquals(
+ "one",
+ NumberSpeller().say(1))
+ }
+
+ @Test
+ fun test14IsSpelledCorrectly() {
+ assertEquals(
+ "fourteen",
+ NumberSpeller().say(14))
+ }
+
+ @Test
+ fun test20IsSpelledCorrectly() {
+ assertEquals(
+ "twenty",
+ NumberSpeller().say(20))
+ }
+
+ @Test
+ fun test22IsSpelledCorrectly() {
+ assertEquals(
+ "twenty-two",
+ NumberSpeller().say(22))
+ }
+
+ @Test
+ fun test100IsSpelledCorrectly() {
+ assertEquals(
+ "one hundred",
+ NumberSpeller().say(100))
+ }
+
+ @Test
+ fun test123IsSpelledCorrectly() {
+ assertEquals(
+ "one hundred twenty-three",
+ NumberSpeller().say(123))
+ }
+
+ @Test
+ fun test1000IsSpelledCorrectly() {
+ assertEquals(
+ "one thousand",
+ NumberSpeller().say(1000))
+ }
+
+ @Test
+ fun test1234IsSpelledCorrectly() {
+ assertEquals(
+ "one thousand two hundred thirty-four",
+ NumberSpeller().say(1234))
+ }
+
+ @Test
+ fun test1000000IsSpelledCorrectly() {
+ assertEquals(
+ "one million",
+ NumberSpeller().say(1000000))
+ }
+
+ @Test
+ fun test1002345IsSpelledCorrectly() {
+ assertEquals(
+ "one million two thousand three hundred forty-five",
+ NumberSpeller().say(1002345))
+ }
+
+ @Test
+ fun test1000000000IsSpelledCorrectly() {
+ assertEquals(
+ "one billion",
+ NumberSpeller().say(1000000000))
+ }
+
+ @Test
+ fun test987654321123IsSpelledCorrectly() {
+ assertEquals(
+ "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three",
+ NumberSpeller().say(987654321123))
+ }
+
+ @Test
+ fun testNegativeNumbersAreOutOfRange() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Input must be non-negative")
+
+ NumberSpeller().say(-1)
+ }
+
+ @Test
+ fun testNumbersAbove1000000000000AreOutOfRange() {
+ expectedException.expect(IllegalArgumentException::class.java)
+ expectedException.expectMessage("Input must be less than 1000000000000")
+
+ NumberSpeller().say(1000000000000)
+ }
+
+}
diff --git a/kotlin/sublist/.gradle/4.0.2/fileChanges/last-build.bin b/kotlin/sublist/.gradle/4.0.2/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/kotlin/sublist/.gradle/4.0.2/fileChanges/last-build.bin differ
diff --git a/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.bin b/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..b4e26cf
Binary files /dev/null and b/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.bin differ
diff --git a/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.lock b/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..c33e5eb
Binary files /dev/null and b/kotlin/sublist/.gradle/4.0.2/fileHashes/fileHashes.lock differ
diff --git a/kotlin/sublist/.gradle/buildOutputCleanup/built.bin b/kotlin/sublist/.gradle/buildOutputCleanup/built.bin
new file mode 100644
index 0000000..e69de29
diff --git a/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties b/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..0c228b7
--- /dev/null
+++ b/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Thu Aug 03 21:26:49 EDT 2017
+gradle.version=4.0.2
diff --git a/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties.lock b/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties.lock
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/kotlin/sublist/.gradle/buildOutputCleanup/cache.properties.lock
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/compiler.xml b/kotlin/sublist/.idea/compiler.xml
new file mode 100644
index 0000000..0df2aa5
--- /dev/null
+++ b/kotlin/sublist/.idea/compiler.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/gradle.xml b/kotlin/sublist/.idea/gradle.xml
new file mode 100644
index 0000000..909b446
--- /dev/null
+++ b/kotlin/sublist/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__junit_junit_4_12.xml b/kotlin/sublist/.idea/libraries/Gradle__junit_junit_4_12.xml
new file mode 100644
index 0000000..04c10dd
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__junit_junit_4_12.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/kotlin/sublist/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..8262f72
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
new file mode 100644
index 0000000..4f32fde
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
new file mode 100644
index 0000000..7b6f562
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
new file mode 100644
index 0000000..1720158
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
new file mode 100644
index 0000000..21c5d19
--- /dev/null
+++ b/kotlin/sublist/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_test_junit_1_1_1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/misc.xml b/kotlin/sublist/.idea/misc.xml
new file mode 100644
index 0000000..84da703
--- /dev/null
+++ b/kotlin/sublist/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/modules.xml b/kotlin/sublist/.idea/modules.xml
new file mode 100644
index 0000000..8f5d495
--- /dev/null
+++ b/kotlin/sublist/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/modules/sublist_main.iml b/kotlin/sublist/.idea/modules/sublist_main.iml
new file mode 100644
index 0000000..edacc5d
--- /dev/null
+++ b/kotlin/sublist/.idea/modules/sublist_main.iml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/modules/sublist_test.iml b/kotlin/sublist/.idea/modules/sublist_test.iml
new file mode 100644
index 0000000..0bfcc52
--- /dev/null
+++ b/kotlin/sublist/.idea/modules/sublist_test.iml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/.idea/workspace.xml b/kotlin/sublist/.idea/workspace.xml
new file mode 100644
index 0000000..b80e6a4
--- /dev/null
+++ b/kotlin/sublist/.idea/workspace.xml
@@ -0,0 +1,773 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Ignore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1501810006237
+
+
+ 1501810006237
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin/sublist/README.md b/kotlin/sublist/README.md
new file mode 100644
index 0000000..42089a9
--- /dev/null
+++ b/kotlin/sublist/README.md
@@ -0,0 +1,24 @@
+# Sublist
+
+Given two lists determine if the first list is contained within the second
+list, if the second list is contained within the first list, if both lists are
+contained within each other or if none of these are true.
+
+Specifically, a list A is a sublist of list B if by dropping 0 or more elements
+from the front of B and 0 or more elements from the back of B you get a list
+that's completely equal to A.
+
+Examples:
+
+ * A = [1, 2, 3], B = [1, 2, 3, 4, 5], A is a sublist of B
+ * A = [3, 4, 5], B = [1, 2, 3, 4, 5], A is a sublist of B
+ * A = [3, 4], B = [1, 2, 3, 4, 5], A is a sublist of B
+ * A = [1, 2, 3], B = [1, 2, 3], A is equal to B
+ * A = [1, 2, 3, 4, 5], B = [2, 3, 4], A is a superlist of B
+ * A = [1, 2, 4], B = [1, 2, 3, 4, 5], A is not a superlist of, sublist of or equal to B
+
+
+
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/kotlin/sublist/build.gradle b/kotlin/sublist/build.gradle
new file mode 100644
index 0000000..16c36c0
--- /dev/null
+++ b/kotlin/sublist/build.gradle
@@ -0,0 +1,28 @@
+buildscript {
+ ext.kotlin_version = '1.1.1'
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'kotlin'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ testCompile 'junit:junit:4.12'
+ testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
+}
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ events = ["passed", "failed", "skipped"]
+ }
+}
diff --git a/kotlin/sublist/out/production/classes/META-INF/sublist_main.kotlin_module b/kotlin/sublist/out/production/classes/META-INF/sublist_main.kotlin_module
new file mode 100644
index 0000000..9129712
Binary files /dev/null and b/kotlin/sublist/out/production/classes/META-INF/sublist_main.kotlin_module differ
diff --git a/kotlin/sublist/src/main/kotlin/ListExt.kt b/kotlin/sublist/src/main/kotlin/ListExt.kt
new file mode 100644
index 0000000..94cdefe
--- /dev/null
+++ b/kotlin/sublist/src/main/kotlin/ListExt.kt
@@ -0,0 +1,43 @@
+fun List.relationshipTo(inpList: List): Relationship{
+
+ if (this == inpList){
+ return Relationship.EQUAL
+ }
+
+ if (this.isEmpty()){
+ return Relationship.SUBLIST
+ }
+
+ if (inpList.isEmpty()){
+ return Relationship.SUPERLIST
+ }
+
+ if (this.subtract(inpList).isNotEmpty()){
+ return Relationship.SUPERLIST
+ }
+
+ if (inpList.subtract(this).isNotEmpty()) {
+ return Relationship.SUBLIST
+ }
+
+ return Relationship.UNEQUAL
+}
+
+fun List.isUnequal(inpList: List): Boolean {
+ for (i in 0..this.size - 1){
+ val droppedList = this.drop(i)
+ val droppedBackList = this.dropLast(i)
+ if (droppedList == inpList || droppedBackList == inpList){
+ return false
+ }
+ }
+
+ for (i in 0..inpList.size - 1){
+ val droppedList = inpList.drop(i)
+ val droppedBackList = this.dropLast(i)
+ if (droppedList == inpList || droppedBackList == inpList){
+ return false
+ }
+ }
+ return true
+}
\ No newline at end of file
diff --git a/kotlin/sublist/src/main/kotlin/Relationship.kt b/kotlin/sublist/src/main/kotlin/Relationship.kt
new file mode 100644
index 0000000..b8f5ab4
--- /dev/null
+++ b/kotlin/sublist/src/main/kotlin/Relationship.kt
@@ -0,0 +1,5 @@
+enum class Relationship {
+
+ EQUAL, SUBLIST, SUPERLIST, UNEQUAL
+
+}
diff --git a/kotlin/sublist/src/test/kotlin/SublistTest.kt b/kotlin/sublist/src/test/kotlin/SublistTest.kt
new file mode 100644
index 0000000..eee3eb9
--- /dev/null
+++ b/kotlin/sublist/src/test/kotlin/SublistTest.kt
@@ -0,0 +1,144 @@
+import org.junit.Ignore
+import org.junit.Test
+import kotlin.test.assertEquals
+
+/*
+ * version: 1.0.0
+ */
+class SublistTest {
+
+ @Test
+ fun testThatTwoEmptyListsAreConsideredEqual() {
+ assertEquals(
+ Relationship.EQUAL,
+ emptyList().relationshipTo(emptyList()))
+ }
+
+ @Test
+ fun testEmptyListIsSublistOfNonEmptyList() {
+ assertEquals(
+ Relationship.SUBLIST,
+ emptyList().relationshipTo(listOf(1, 2, 3)))
+ }
+
+ @Test
+ fun testNonEmptyListIsSuperlistOfEmptyList() {
+ assertEquals(
+ Relationship.SUPERLIST,
+ listOf('1', '2', '3').relationshipTo(emptyList()))
+ }
+
+ @Test
+ fun testListIsEqualToItself() {
+ val anyList = listOf("1", "2", "3")
+
+ assertEquals(
+ Relationship.EQUAL,
+ anyList.relationshipTo(anyList))
+ }
+
+
+ @Test
+ fun testDifferentListsOfTheSameLengthAreUnequal() {
+ assertEquals(
+ Relationship.UNEQUAL,
+ listOf(1, 2, 3).relationshipTo(listOf(2, 3, 4)))
+ }
+
+
+ @Test
+ fun testSublistCheckDoesNotAbortAfterFalseStart() {
+ assertEquals(
+ Relationship.SUBLIST,
+ listOf('1', '2', '5').relationshipTo(listOf('0', '1', '2', '3', '1', '2', '5', '6')))
+ }
+
+
+ @Test
+ fun testSublistCheckHandlesExtraneousRepeatsOfFirstEntry() {
+ assertEquals(
+ Relationship.SUBLIST,
+ listOf("1", "1", "2").relationshipTo(listOf("0", "1", "1", "1", "2", "1", "2")))
+ }
+
+
+ @Test
+ fun testSublistAtStart() {
+ assertEquals(
+ Relationship.SUBLIST,
+ listOf(0, 1, 2).relationshipTo(listOf(0, 1, 2, 3, 4, 5)))
+ }
+
+
+ @Test
+ fun testSublistInMiddle() {
+ assertEquals(
+ Relationship.SUBLIST,
+ listOf('2', '3', '4').relationshipTo(listOf('0', '1', '2', '3', '4', '5')))
+ }
+
+
+ @Test
+ fun testSublistAtEnd() {
+ assertEquals(
+ Relationship.SUBLIST,
+ listOf("3", "4", "5").relationshipTo(listOf("0", "1", "2", "3", "4", "5")))
+ }
+
+
+ @Test
+ fun testAtStartOfSuperlist() {
+ assertEquals(
+ Relationship.SUPERLIST,
+ listOf(0, 1, 2, 3, 4, 5).relationshipTo(listOf(0, 1, 2)))
+ }
+
+
+ @Test
+ fun testInMiddleOfSuperlist() {
+ assertEquals(
+ Relationship.SUPERLIST,
+ listOf('0', '1', '2', '3', '4', '5').relationshipTo(listOf('2', '3')))
+ }
+
+
+ @Test
+ fun testAtEndOfSuperlist() {
+ assertEquals(
+ Relationship.SUPERLIST,
+ listOf("0", "1", "2", "3", "4", "5").relationshipTo(listOf("3", "4", "5")))
+ }
+
+
+ @Test
+ fun testFirstListMissingElementFromSecondList() {
+ assertEquals(
+ Relationship.UNEQUAL,
+ listOf(1, 3).relationshipTo(listOf(1, 2, 3)))
+ }
+
+
+ @Test
+ fun testSecondListMissingElementFromFirstList() {
+ assertEquals(
+ Relationship.UNEQUAL,
+ listOf('1', '2', '3').relationshipTo(listOf('1', '3')))
+ }
+
+
+ @Test
+ fun testThatListOrderingIsAccountedFor() {
+ assertEquals(
+ Relationship.UNEQUAL,
+ listOf("1", "2", "3").relationshipTo(listOf("3", "2", "1")))
+ }
+
+
+ @Test
+ fun testThatListsWithSameDigitsButDifferentNumbersAreUnequal() {
+ assertEquals(
+ Relationship.UNEQUAL,
+ listOf(1, 0, 1).relationshipTo(listOf(10, 1)))
+ }
+
+}
diff --git a/kotlin/sublist/sublist.iml b/kotlin/sublist/sublist.iml
new file mode 100644
index 0000000..6f269f6
--- /dev/null
+++ b/kotlin/sublist/sublist.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/typescript/hello-world/README.md b/typescript/hello-world/README.md
new file mode 100644
index 0000000..6513749
--- /dev/null
+++ b/typescript/hello-world/README.md
@@ -0,0 +1,47 @@
+# Hello World
+
+The classical introductory exercise. Just say "Hello, World!".
+
+["Hello, World!"](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program) is
+the traditional first program for beginning programming in a new language
+or environment.
+
+The objectives are simple:
+
+- Write a function that returns the string "Hello, World!".
+- Run the test suite and make sure that it succeeds.
+- Submit your solution and check it at the website.
+
+If everything goes well, you will be ready to fetch your first real exercise.
+
+## Setup
+
+Go through the setup instructions for TypeScript to
+install the necessary dependencies:
+
+http://exercism.io/languages/typescript
+
+## Requirements
+
+Install assignment dependencies:
+
+```bash
+$ yarn install
+```
+
+## Making the test suite pass
+
+Execute the tests with:
+
+```bash
+$ yarn test
+```
+
+
+
+## Source
+
+This is an exercise to introduce users to using Exercism [http://en.wikipedia.org/wiki/%22Hello,_world!%22_program](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program)
+
+## Submitting Incomplete Solutions
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/typescript/hello-world/hello-world.test.ts b/typescript/hello-world/hello-world.test.ts
new file mode 100644
index 0000000..4195881
--- /dev/null
+++ b/typescript/hello-world/hello-world.test.ts
@@ -0,0 +1,17 @@
+
+import HelloWorld from "./hello-world"
+
+describe('Hello World', () => {
+
+ it('says hello world with no name', () => {
+ expect(HelloWorld.hello()).toEqual('Hello, World!')
+ })
+
+ xit('says hello to bob', () => {
+ expect(HelloWorld.hello('Bob')).toEqual('Hello, Bob!')
+ })
+
+ xit('says hello to sally', () => {
+ expect(HelloWorld.hello('Sally')).toEqual('Hello, Sally!')
+ })
+})
diff --git a/typescript/hello-world/node_modules/.bin/acorn b/typescript/hello-world/node_modules/.bin/acorn
new file mode 120000
index 0000000..cf76760
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/acorn
@@ -0,0 +1 @@
+../acorn/bin/acorn
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/babylon b/typescript/hello-world/node_modules/.bin/babylon
new file mode 120000
index 0000000..c2adc01
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/babylon
@@ -0,0 +1 @@
+../babylon/bin/babylon.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/errno b/typescript/hello-world/node_modules/.bin/errno
new file mode 120000
index 0000000..5a98e53
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/errno
@@ -0,0 +1 @@
+../errno/cli.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/escodegen b/typescript/hello-world/node_modules/.bin/escodegen
new file mode 120000
index 0000000..01a7c32
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/escodegen
@@ -0,0 +1 @@
+../escodegen/bin/escodegen.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/esgenerate b/typescript/hello-world/node_modules/.bin/esgenerate
new file mode 120000
index 0000000..7d0293e
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/esgenerate
@@ -0,0 +1 @@
+../escodegen/bin/esgenerate.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/esparse b/typescript/hello-world/node_modules/.bin/esparse
new file mode 120000
index 0000000..4ec5d1b
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/esparse
@@ -0,0 +1 @@
+../escodegen/node_modules/esprima/bin/esparse.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/esvalidate b/typescript/hello-world/node_modules/.bin/esvalidate
new file mode 120000
index 0000000..a4ef518
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/esvalidate
@@ -0,0 +1 @@
+../escodegen/node_modules/esprima/bin/esvalidate.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/handlebars b/typescript/hello-world/node_modules/.bin/handlebars
new file mode 120000
index 0000000..fb7d090
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/handlebars
@@ -0,0 +1 @@
+../handlebars/bin/handlebars
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/jest b/typescript/hello-world/node_modules/.bin/jest
new file mode 120000
index 0000000..3d9fe5c
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/jest
@@ -0,0 +1 @@
+../jest-cli/bin/jest.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/jest-runtime b/typescript/hello-world/node_modules/.bin/jest-runtime
new file mode 120000
index 0000000..ec00171
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/jest-runtime
@@ -0,0 +1 @@
+../jest-runtime/bin/jest-runtime.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/js-yaml b/typescript/hello-world/node_modules/.bin/js-yaml
new file mode 120000
index 0000000..9dbd010
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/js-yaml
@@ -0,0 +1 @@
+../js-yaml/bin/js-yaml.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/jsesc b/typescript/hello-world/node_modules/.bin/jsesc
new file mode 120000
index 0000000..7237604
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/jsesc
@@ -0,0 +1 @@
+../jsesc/bin/jsesc
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/json5 b/typescript/hello-world/node_modules/.bin/json5
new file mode 120000
index 0000000..217f379
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/json5
@@ -0,0 +1 @@
+../json5/lib/cli.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/loose-envify b/typescript/hello-world/node_modules/.bin/loose-envify
new file mode 120000
index 0000000..ed9009c
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/loose-envify
@@ -0,0 +1 @@
+../loose-envify/cli.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/mkdirp b/typescript/hello-world/node_modules/.bin/mkdirp
new file mode 120000
index 0000000..017896c
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/rimraf b/typescript/hello-world/node_modules/.bin/rimraf
new file mode 120000
index 0000000..4cd49a4
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/rimraf
@@ -0,0 +1 @@
+../rimraf/bin.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/sane b/typescript/hello-world/node_modules/.bin/sane
new file mode 120000
index 0000000..ab4163b
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/sane
@@ -0,0 +1 @@
+../sane/src/cli.js
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/semver b/typescript/hello-world/node_modules/.bin/semver
new file mode 120000
index 0000000..317eb29
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/semver
@@ -0,0 +1 @@
+../semver/bin/semver
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/sshpk-conv b/typescript/hello-world/node_modules/.bin/sshpk-conv
new file mode 120000
index 0000000..a2a295c
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/sshpk-conv
@@ -0,0 +1 @@
+../sshpk/bin/sshpk-conv
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/sshpk-sign b/typescript/hello-world/node_modules/.bin/sshpk-sign
new file mode 120000
index 0000000..766b9b3
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/sshpk-sign
@@ -0,0 +1 @@
+../sshpk/bin/sshpk-sign
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/sshpk-verify b/typescript/hello-world/node_modules/.bin/sshpk-verify
new file mode 120000
index 0000000..bfd7e3a
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/sshpk-verify
@@ -0,0 +1 @@
+../sshpk/bin/sshpk-verify
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/tsc b/typescript/hello-world/node_modules/.bin/tsc
new file mode 120000
index 0000000..0863208
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/tsc
@@ -0,0 +1 @@
+../typescript/bin/tsc
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/tslint b/typescript/hello-world/node_modules/.bin/tslint
new file mode 120000
index 0000000..7d8df74
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/tslint
@@ -0,0 +1 @@
+../tslint/bin/tslint
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/tsserver b/typescript/hello-world/node_modules/.bin/tsserver
new file mode 120000
index 0000000..f8f8f1a
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/tsserver
@@ -0,0 +1 @@
+../typescript/bin/tsserver
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/uglifyjs b/typescript/hello-world/node_modules/.bin/uglifyjs
new file mode 120000
index 0000000..fef3468
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/uglifyjs
@@ -0,0 +1 @@
+../uglify-js/bin/uglifyjs
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/uuid b/typescript/hello-world/node_modules/.bin/uuid
new file mode 120000
index 0000000..b3e45bc
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/uuid
@@ -0,0 +1 @@
+../uuid/bin/uuid
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.bin/which b/typescript/hello-world/node_modules/.bin/which
new file mode 120000
index 0000000..f62471c
--- /dev/null
+++ b/typescript/hello-world/node_modules/.bin/which
@@ -0,0 +1 @@
+../which/bin/which
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/.yarn-integrity b/typescript/hello-world/node_modules/.yarn-integrity
new file mode 100644
index 0000000..8914052
--- /dev/null
+++ b/typescript/hello-world/node_modules/.yarn-integrity
@@ -0,0 +1,443 @@
+{
+ "flags": [],
+ "linkedModules": [],
+ "topLevelPatterns": [
+ "@types/jest@^20.0.0",
+ "@types/node@^7.0.5",
+ "jest@^20.0.4",
+ "ts-jest@^20.0.6",
+ "tslint@^5.4.3",
+ "typescript@^2.2.1"
+ ],
+ "lockfileEntries": {
+ "@types/babel-core@^6.7.14": "https://registry.yarnpkg.com/@types/babel-core/-/babel-core-6.7.14.tgz#a08c900a98e8987c1a98d2ea4fa0a1805a7d131f",
+ "@types/babel-template@*": "https://registry.yarnpkg.com/@types/babel-template/-/babel-template-6.7.14.tgz#8088a56f9d697d620d3d079c3ef66025b7a08d02",
+ "@types/babel-traverse@*": "https://registry.yarnpkg.com/@types/babel-traverse/-/babel-traverse-6.7.17.tgz#5212a4edced81f53a6c4fb1fd7a34aa4ff6cf36b",
+ "@types/babel-types@*": "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-6.7.16.tgz#e2602896636858a0067971f7ca4bb8678038293f",
+ "@types/babylon@*": "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.1.tgz#e4d10ab9e43a73703a17c6f41438bede28769340",
+ "@types/jest@^20.0.0": "https://registry.yarnpkg.com/@types/jest/-/jest-20.0.0.tgz#f7119f92891e150b33d67505cdd6d95585156133",
+ "@types/node@^7.0.5": "https://registry.yarnpkg.com/@types/node/-/node-7.0.31.tgz#80ea4d175599b2a00149c29a10a4eb2dff592e86",
+ "abab@^1.0.3": "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d",
+ "acorn-globals@^3.1.0": "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf",
+ "acorn@^4.0.4": "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787",
+ "ajv@^4.9.1": "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536",
+ "align-text@^0.1.1": "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117",
+ "align-text@^0.1.3": "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117",
+ "amdefine@>=0.0.4": "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5",
+ "ansi-escapes@^1.4.0": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e",
+ "ansi-regex@^2.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df",
+ "ansi-regex@^2.1.1": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df",
+ "ansi-styles@^2.2.1": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe",
+ "ansi-styles@^3.0.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750",
+ "anymatch@^1.3.0": "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507",
+ "append-transform@^0.4.0": "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991",
+ "argparse@^1.0.7": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86",
+ "arr-diff@^2.0.0": "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf",
+ "arr-flatten@^1.0.1": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1",
+ "array-equal@^1.0.0": "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93",
+ "array-unique@^0.2.1": "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53",
+ "arrify@^1.0.0": "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d",
+ "arrify@^1.0.1": "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d",
+ "asn1@~0.2.3": "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86",
+ "assert-plus@1.0.0": "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525",
+ "assert-plus@^0.2.0": "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234",
+ "assert-plus@^1.0.0": "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525",
+ "async@^1.4.0": "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a",
+ "async@^2.1.4": "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7",
+ "asynckit@^0.4.0": "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79",
+ "aws-sign2@~0.6.0": "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f",
+ "aws4@^1.2.1": "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e",
+ "babel-code-frame@^6.22.0": "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4",
+ "babel-core@^6.0.0": "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729",
+ "babel-core@^6.24.1": "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729",
+ "babel-generator@^6.18.0": "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc",
+ "babel-generator@^6.25.0": "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc",
+ "babel-helpers@^6.24.1": "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2",
+ "babel-jest@^20.0.3": "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671",
+ "babel-messages@^6.23.0": "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e",
+ "babel-plugin-istanbul@^4.0.0": "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz#18dde84bf3ce329fddf3f4103fae921456d8e587",
+ "babel-plugin-istanbul@^4.1.4": "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz#18dde84bf3ce329fddf3f4103fae921456d8e587",
+ "babel-plugin-jest-hoist@^20.0.3": "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767",
+ "babel-plugin-transform-es2015-modules-commonjs@^6.24.1": "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe",
+ "babel-plugin-transform-strict-mode@^6.24.1": "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758",
+ "babel-preset-jest@^20.0.3": "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a",
+ "babel-register@^6.24.1": "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f",
+ "babel-runtime@^6.22.0": "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b",
+ "babel-template@^6.16.0": "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071",
+ "babel-template@^6.24.1": "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071",
+ "babel-template@^6.25.0": "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071",
+ "babel-traverse@^6.18.0": "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1",
+ "babel-traverse@^6.25.0": "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1",
+ "babel-types@^6.18.0": "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e",
+ "babel-types@^6.24.1": "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e",
+ "babel-types@^6.25.0": "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e",
+ "babylon@^6.13.0": "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48",
+ "babylon@^6.17.2": "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48",
+ "balanced-match@^1.0.0": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767",
+ "bcrypt-pbkdf@^1.0.0": "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d",
+ "boom@2.x.x": "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f",
+ "brace-expansion@^1.1.7": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292",
+ "braces@^1.8.2": "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7",
+ "browser-resolve@^1.11.2": "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce",
+ "bser@1.0.2": "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169",
+ "bser@^2.0.0": "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719",
+ "builtin-modules@^1.0.0": "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f",
+ "callsites@^2.0.0": "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50",
+ "camelcase@^1.0.2": "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39",
+ "camelcase@^3.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a",
+ "camelcase@^4.1.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd",
+ "caseless@~0.12.0": "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc",
+ "center-align@^0.1.1": "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad",
+ "chalk@^1.1.0": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98",
+ "chalk@^1.1.3": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98",
+ "ci-info@^1.0.0": "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534",
+ "cliui@^2.1.0": "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1",
+ "cliui@^3.2.0": "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d",
+ "co@^4.6.0": "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184",
+ "code-point-at@^1.0.0": "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77",
+ "color-convert@^1.0.0": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a",
+ "color-name@^1.1.1": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d",
+ "colors@^1.1.2": "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63",
+ "combined-stream@^1.0.5": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009",
+ "combined-stream@~1.0.5": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009",
+ "commander@^2.9.0": "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4",
+ "concat-map@0.0.1": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b",
+ "content-type-parser@^1.0.1": "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94",
+ "convert-source-map@^1.1.0": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5",
+ "convert-source-map@^1.4.0": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5",
+ "core-js@^2.4.0": "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e",
+ "cross-spawn@^4.0.0": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41",
+ "cryptiles@2.x.x": "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8",
+ "cssom@0.3.x": "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b",
+ "cssom@>= 0.3.2 < 0.4.0": "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b",
+ "cssstyle@>= 0.2.37 < 0.3.0": "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54",
+ "dashdash@^1.12.0": "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0",
+ "debug@^2.1.1": "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc",
+ "debug@^2.2.0": "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc",
+ "debug@^2.6.3": "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc",
+ "decamelize@^1.0.0": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290",
+ "decamelize@^1.1.1": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290",
+ "deep-is@~0.1.3": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34",
+ "default-require-extensions@^1.0.0": "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8",
+ "delayed-stream@~1.0.0": "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619",
+ "detect-indent@^4.0.0": "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208",
+ "diff@^3.2.0": "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9",
+ "ecc-jsbn@~0.1.1": "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505",
+ "errno@>=0.1.1 <0.2.0-0": "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d",
+ "error-ex@^1.2.0": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc",
+ "escape-string-regexp@^1.0.2": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4",
+ "escodegen@^1.6.1": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018",
+ "esprima@^2.7.1": "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581",
+ "esprima@^3.1.1": "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633",
+ "estraverse@^1.9.1": "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44",
+ "esutils@^2.0.2": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b",
+ "exec-sh@^0.2.0": "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10",
+ "execa@^0.5.0": "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36",
+ "expand-brackets@^0.1.4": "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b",
+ "expand-range@^1.8.1": "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337",
+ "extend@~3.0.0": "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444",
+ "extglob@^0.3.1": "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1",
+ "extsprintf@1.0.2": "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550",
+ "fast-levenshtein@~2.0.4": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917",
+ "fb-watchman@^1.8.0": "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383",
+ "fb-watchman@^2.0.0": "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58",
+ "filename-regex@^2.0.0": "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26",
+ "fileset@^2.0.2": "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0",
+ "fill-range@^2.1.0": "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723",
+ "find-up@^1.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f",
+ "find-up@^2.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7",
+ "find-up@^2.1.0": "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7",
+ "for-in@^1.0.1": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80",
+ "for-own@^0.1.4": "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce",
+ "forever-agent@~0.6.1": "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91",
+ "form-data@~2.1.1": "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1",
+ "fs-extra@^3.0.0": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291",
+ "fs.realpath@^1.0.0": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f",
+ "get-caller-file@^1.0.1": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5",
+ "get-stream@^2.2.0": "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de",
+ "getpass@^0.1.1": "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa",
+ "glob-base@^0.3.0": "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4",
+ "glob-parent@^2.0.0": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28",
+ "glob@^7.0.3": "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15",
+ "glob@^7.0.5": "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15",
+ "glob@^7.1.1": "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15",
+ "globals@^9.0.0": "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a",
+ "graceful-fs@^4.1.11": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658",
+ "graceful-fs@^4.1.2": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658",
+ "graceful-fs@^4.1.6": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658",
+ "graceful-readlink@>= 1.0.0": "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
+ "growly@^1.3.0": "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081",
+ "handlebars@^4.0.3": "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f",
+ "har-schema@^1.0.5": "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e",
+ "har-validator@~4.2.1": "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a",
+ "has-ansi@^2.0.0": "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91",
+ "has-flag@^1.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa",
+ "hawk@~3.1.3": "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4",
+ "hoek@2.x.x": "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed",
+ "home-or-tmp@^2.0.0": "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8",
+ "hosted-git-info@^2.1.4": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67",
+ "html-encoding-sniffer@^1.0.1": "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da",
+ "http-signature@~1.1.0": "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf",
+ "iconv-lite@0.4.13": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2",
+ "inflight@^1.0.4": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9",
+ "inherits@2": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de",
+ "invariant@^2.2.0": "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360",
+ "invert-kv@^1.0.0": "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6",
+ "is-arrayish@^0.2.1": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d",
+ "is-buffer@^1.1.5": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc",
+ "is-builtin-module@^1.0.0": "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe",
+ "is-ci@^1.0.10": "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e",
+ "is-dotfile@^1.0.0": "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1",
+ "is-equal-shallow@^0.1.3": "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534",
+ "is-extendable@^0.1.1": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89",
+ "is-extglob@^1.0.0": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0",
+ "is-finite@^1.0.0": "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa",
+ "is-fullwidth-code-point@^1.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb",
+ "is-fullwidth-code-point@^2.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f",
+ "is-glob@^2.0.0": "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863",
+ "is-glob@^2.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863",
+ "is-number@^2.1.0": "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f",
+ "is-number@^3.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195",
+ "is-posix-bracket@^0.1.0": "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4",
+ "is-primitive@^2.0.0": "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575",
+ "is-stream@^1.1.0": "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44",
+ "is-typedarray@~1.0.0": "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a",
+ "is-utf8@^0.2.0": "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72",
+ "isarray@1.0.0": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11",
+ "isexe@^2.0.0": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10",
+ "isobject@^2.0.0": "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89",
+ "isstream@~0.1.2": "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a",
+ "istanbul-api@^1.1.1": "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8",
+ "istanbul-lib-coverage@^1.0.1": "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da",
+ "istanbul-lib-coverage@^1.1.1": "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da",
+ "istanbul-lib-hook@^1.0.7": "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc",
+ "istanbul-lib-instrument@^1.4.2": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56",
+ "istanbul-lib-instrument@^1.7.2": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56",
+ "istanbul-lib-report@^1.1.1": "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9",
+ "istanbul-lib-source-maps@^1.1.0": "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c",
+ "istanbul-lib-source-maps@^1.2.1": "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c",
+ "istanbul-reports@^1.1.1": "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e",
+ "jest-changed-files@^20.0.3": "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8",
+ "jest-cli@^20.0.4": "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93",
+ "jest-config@^20.0.0": "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea",
+ "jest-config@^20.0.4": "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea",
+ "jest-diff@^20.0.3": "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617",
+ "jest-docblock@^20.0.3": "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712",
+ "jest-environment-jsdom@^20.0.3": "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99",
+ "jest-environment-node@^20.0.3": "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403",
+ "jest-haste-map@^20.0.4": "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.4.tgz#653eb55c889ce3c021f7b94693f20a4159badf03",
+ "jest-jasmine2@^20.0.4": "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1",
+ "jest-matcher-utils@^20.0.3": "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612",
+ "jest-matchers@^20.0.3": "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60",
+ "jest-message-util@^20.0.3": "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c",
+ "jest-mock@^20.0.3": "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59",
+ "jest-regex-util@^20.0.3": "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762",
+ "jest-resolve-dependencies@^20.0.3": "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a",
+ "jest-resolve@^20.0.4": "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5",
+ "jest-runtime@^20.0.4": "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8",
+ "jest-snapshot@^20.0.3": "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566",
+ "jest-util@^20.0.0": "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad",
+ "jest-util@^20.0.3": "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad",
+ "jest-validate@^20.0.3": "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab",
+ "jest@^20.0.4": "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac",
+ "js-tokens@^3.0.0": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7",
+ "js-yaml@^3.7.0": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6",
+ "jsbn@~0.1.0": "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513",
+ "jsdom@^9.12.0": "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4",
+ "jsesc@^1.3.0": "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b",
+ "json-schema@0.2.3": "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13",
+ "json-stable-stringify@^1.0.1": "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af",
+ "json-stringify-safe@~5.0.1": "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb",
+ "json5@^0.5.0": "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821",
+ "jsonfile@^3.0.0": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.0.tgz#92e7c7444e5ffd5fa32e6a9ae8b85034df8347d0",
+ "jsonify@~0.0.0": "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73",
+ "jsprim@^1.2.2": "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918",
+ "kind-of@^3.0.2": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64",
+ "kind-of@^4.0.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57",
+ "lazy-cache@^1.0.3": "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e",
+ "lcid@^1.0.0": "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835",
+ "leven@^2.1.0": "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580",
+ "levn@~0.3.0": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee",
+ "load-json-file@^1.0.0": "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0",
+ "load-json-file@^2.0.0": "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8",
+ "locate-path@^2.0.0": "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e",
+ "lodash@^4.14.0": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae",
+ "lodash@^4.2.0": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae",
+ "longest@^1.0.1": "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097",
+ "loose-envify@^1.0.0": "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848",
+ "lru-cache@^4.0.1": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55",
+ "makeerror@1.0.x": "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c",
+ "mem@^1.1.0": "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76",
+ "merge@^1.1.3": "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da",
+ "micromatch@^2.1.5": "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565",
+ "micromatch@^2.3.11": "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565",
+ "mime-db@~1.27.0": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1",
+ "mime-types@^2.1.12": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed",
+ "mime-types@~2.1.7": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed",
+ "mimic-fn@^1.0.0": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18",
+ "minimatch@^3.0.2": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083",
+ "minimatch@^3.0.3": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083",
+ "minimatch@^3.0.4": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083",
+ "minimist@0.0.8": "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d",
+ "minimist@^1.1.1": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284",
+ "minimist@~0.0.1": "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d",
+ "mkdirp@^0.5.1": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903",
+ "ms@2.0.0": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8",
+ "natural-compare@^1.4.0": "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7",
+ "node-int64@^0.4.0": "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b",
+ "node-notifier@^5.0.2": "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff",
+ "normalize-package-data@^2.3.2": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb",
+ "normalize-path@^2.0.1": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9",
+ "npm-run-path@^2.0.0": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f",
+ "number-is-nan@^1.0.0": "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d",
+ "nwmatcher@>= 1.3.9 < 2.0.0": "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.0.tgz#b4389362170e7ef9798c3c7716d80ebc0106fccf",
+ "oauth-sign@~0.8.1": "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43",
+ "object-assign@^4.0.1": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863",
+ "object-assign@^4.1.0": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863",
+ "object.omit@^2.0.0": "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa",
+ "once@^1.3.0": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1",
+ "once@^1.4.0": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1",
+ "optimist@^0.6.1": "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686",
+ "optionator@^0.8.1": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64",
+ "os-homedir@^1.0.0": "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3",
+ "os-locale@^1.4.0": "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9",
+ "os-locale@^2.0.0": "https://registry.yarnpkg.com/os-locale/-/os-locale-2.0.0.tgz#15918ded510522b81ee7ae5a309d54f639fc39a4",
+ "os-tmpdir@^1.0.1": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274",
+ "p-finally@^1.0.0": "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae",
+ "p-limit@^1.1.0": "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc",
+ "p-locate@^2.0.0": "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43",
+ "p-map@^1.1.1": "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a",
+ "parse-glob@^3.0.4": "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c",
+ "parse-json@^2.2.0": "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9",
+ "parse5@^1.5.1": "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94",
+ "path-exists@^2.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b",
+ "path-exists@^3.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515",
+ "path-is-absolute@^1.0.0": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f",
+ "path-key@^2.0.0": "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40",
+ "path-parse@^1.0.5": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1",
+ "path-type@^1.0.0": "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441",
+ "path-type@^2.0.0": "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73",
+ "performance-now@^0.2.0": "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5",
+ "pify@^2.0.0": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c",
+ "pify@^2.3.0": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c",
+ "pinkie-promise@^2.0.0": "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa",
+ "pinkie@^2.0.0": "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870",
+ "pkg-dir@^2.0.0": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b",
+ "prelude-ls@~1.1.2": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54",
+ "preserve@^0.2.0": "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b",
+ "pretty-format@^20.0.3": "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14",
+ "private@^0.1.6": "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1",
+ "prr@~0.0.0": "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a",
+ "pseudomap@^1.0.2": "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3",
+ "punycode@^1.4.1": "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e",
+ "qs@~6.4.0": "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233",
+ "randomatic@^1.1.3": "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c",
+ "read-pkg-up@^1.0.1": "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02",
+ "read-pkg-up@^2.0.0": "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be",
+ "read-pkg@^1.0.0": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28",
+ "read-pkg@^2.0.0": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8",
+ "regenerator-runtime@^0.10.0": "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658",
+ "regex-cache@^0.4.2": "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145",
+ "remove-trailing-separator@^1.0.1": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511",
+ "repeat-element@^1.1.2": "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a",
+ "repeat-string@^1.5.2": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637",
+ "repeating@^2.0.0": "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda",
+ "request@^2.79.0": "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0",
+ "require-directory@^2.1.1": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42",
+ "require-main-filename@^1.0.1": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1",
+ "resolve@1.1.7": "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b",
+ "resolve@^1.3.2": "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5",
+ "right-align@^0.1.1": "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef",
+ "rimraf@^2.6.1": "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d",
+ "safe-buffer@^5.0.1": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223",
+ "sane@~1.6.0": "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775",
+ "sax@^1.2.1": "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828",
+ "semver@2 || 3 || 4 || 5": "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f",
+ "semver@^5.3.0": "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f",
+ "set-blocking@^2.0.0": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7",
+ "shellwords@^0.1.0": "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14",
+ "signal-exit@^3.0.0": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d",
+ "slash@^1.0.0": "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55",
+ "sntp@1.x.x": "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198",
+ "source-map-support@^0.4.2": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1",
+ "source-map-support@^0.4.4": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1",
+ "source-map@^0.4.4": "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b",
+ "source-map@^0.5.0": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412",
+ "source-map@^0.5.3": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412",
+ "source-map@^0.5.6": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412",
+ "source-map@~0.2.0": "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d",
+ "source-map@~0.5.1": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412",
+ "spdx-correct@~1.0.0": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40",
+ "spdx-expression-parse@~1.0.0": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c",
+ "spdx-license-ids@^1.0.2": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57",
+ "sprintf-js@~1.0.2": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c",
+ "sshpk@^1.7.0": "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3",
+ "string-length@^1.0.1": "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac",
+ "string-width@^1.0.1": "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3",
+ "string-width@^1.0.2": "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3",
+ "string-width@^2.0.0": "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e",
+ "stringstream@~0.0.4": "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878",
+ "strip-ansi@^3.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf",
+ "strip-ansi@^3.0.1": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf",
+ "strip-bom@3.0.0": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3",
+ "strip-bom@^2.0.0": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e",
+ "strip-bom@^3.0.0": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3",
+ "strip-eof@^1.0.0": "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf",
+ "strip-json-comments@^2.0.0": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a",
+ "supports-color@^2.0.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7",
+ "supports-color@^3.1.2": "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6",
+ "symbol-tree@^3.2.1": "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6",
+ "test-exclude@^4.1.1": "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26",
+ "throat@^3.0.0": "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836",
+ "tmpl@1.0.x": "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1",
+ "to-fast-properties@^1.0.1": "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47",
+ "tough-cookie@^2.3.2": "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a",
+ "tough-cookie@~2.3.0": "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a",
+ "tr46@~0.0.3": "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a",
+ "trim-right@^1.0.1": "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003",
+ "ts-jest@^20.0.6": "https://registry.yarnpkg.com/ts-jest/-/ts-jest-20.0.6.tgz#39c2810c05d6f6908dac15929dae206b494b73f4",
+ "tsconfig@^6.0.0": "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032",
+ "tslib@^1.7.1": "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec",
+ "tslint@^5.4.3": "https://registry.yarnpkg.com/tslint/-/tslint-5.4.3.tgz#761c8402b80e347b7733a04390a757b253580467",
+ "tsutils@^2.3.0": "https://registry.yarnpkg.com/tsutils/-/tsutils-2.4.0.tgz#ad4ce6dba0e5a3edbddf8626b7ca040782189fea",
+ "tunnel-agent@^0.6.0": "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd",
+ "tweetnacl@^0.14.3": "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64",
+ "tweetnacl@~0.14.0": "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64",
+ "type-check@~0.3.2": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72",
+ "typescript@^2.2.1": "https://registry.yarnpkg.com/typescript/-/typescript-2.4.0.tgz#aef5a8d404beba36ad339abf079ddddfffba86dd",
+ "uglify-js@^2.6": "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd",
+ "uglify-to-browserify@~1.0.0": "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7",
+ "universalify@^0.1.0": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778",
+ "uuid@^3.0.0": "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04",
+ "validate-npm-package-license@^3.0.1": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc",
+ "verror@1.3.6": "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c",
+ "walker@~1.0.5": "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb",
+ "watch@~0.10.0": "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc",
+ "webidl-conversions@^3.0.0": "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871",
+ "webidl-conversions@^4.0.0": "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0",
+ "whatwg-encoding@^1.0.1": "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4",
+ "whatwg-url@^4.3.0": "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0",
+ "which-module@^1.0.0": "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f",
+ "which-module@^2.0.0": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a",
+ "which@^1.2.12": "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5",
+ "which@^1.2.9": "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5",
+ "window-size@0.1.0": "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d",
+ "wordwrap@0.0.2": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f",
+ "wordwrap@~0.0.2": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107",
+ "wordwrap@~1.0.0": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb",
+ "worker-farm@^1.3.1": "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff",
+ "wrap-ansi@^2.0.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85",
+ "wrappy@1": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
+ "xml-name-validator@^2.0.1": "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635",
+ "xtend@>=4.0.0 <4.1.0-0": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af",
+ "y18n@^3.2.1": "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41",
+ "yallist@^2.1.2": "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52",
+ "yargs-parser@^5.0.0": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a",
+ "yargs-parser@^7.0.0": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9",
+ "yargs@^7.0.2": "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8",
+ "yargs@^8.0.1": "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360",
+ "yargs@~3.10.0": "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ },
+ "files": [],
+ "artifacts": {}
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-core/README.md b/typescript/hello-world/node_modules/@types/babel-core/README.md
new file mode 100644
index 0000000..5da677b
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-core/README.md
@@ -0,0 +1,18 @@
+# Installation
+> `npm install --save @types/babel-core`
+
+# Summary
+This package contains type definitions for babel-core v6.7 (https://github.com/babel/babel/tree/master/packages/babel-core).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/types-2.0/babel-core
+
+Additional Details
+ * Last updated: Mon, 19 Sep 2016 16:15:22 GMT
+ * File structure: UMD
+ * Library Dependencies: babel-template, babel-traverse, babel-types
+ * Module Dependencies: babel-template, babel-traverse, babel-types
+ * Global values: babel
+
+# Credits
+These definitions were written by Troy Gerwien .
diff --git a/typescript/hello-world/node_modules/@types/babel-core/index.d.ts b/typescript/hello-world/node_modules/@types/babel-core/index.d.ts
new file mode 100644
index 0000000..9a42339
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-core/index.d.ts
@@ -0,0 +1,144 @@
+// Type definitions for babel-core v6.7
+// Project: https://github.com/babel/babel/tree/master/packages/babel-core
+// Definitions by: Troy Gerwien
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+///
+///
+
+import * as t from 'babel-types';
+export {t as types};
+type Node = t.Node;
+export import template = require('babel-template');
+export var version: string;
+import traverse, {Visitor} from "babel-traverse";
+export {traverse, Visitor};
+
+
+/** Transforms the passed in `code`. Returning an object with the generated code, source map, and AST. */
+export function transform(code: string, opts?: TransformOptions): BabelFileResult;
+
+/** Asynchronously transforms the entire contents of a file. */
+export function transformFile(filename: string, opts: TransformOptions, callback: (err: any, result: BabelFileResult) => void): void;
+
+/** Synchronous version of `babel.transformFile`. Returns the transformed contents of the `filename`. */
+export function transformFileSync(filename: string, opts?: TransformOptions): BabelFileResult;
+
+export function transformFromAst(ast: Node, code?: string, opts?: TransformOptions): BabelFileResult;
+
+export interface TransformOptions {
+
+ /** Filename to use when reading from stdin - this will be used in source-maps, errors etc. Default: "unknown". */
+ filename?: string;
+
+ /** Filename relative to `sourceRoot`. */
+ filenameRelative?: string;
+
+ /** A source map object that the output source map will be based on. */
+ inputSourceMap?: Object;
+
+ /**
+ * This is an object of keys that represent different environments. For example, you may have:
+ * `{ env: { production: { / * specific options * / } } }`
+ * which will use those options when the enviroment variable `BABEL_ENV` is set to `"production"`.
+ * If `BABEL_ENV` isn't set then `NODE_ENV` will be used, if it's not set then it defaults to `"development"`.
+ */
+ env?: Object;
+
+ /** Retain line numbers - will result in really ugly code. Default: `false` */
+ retainLines?: boolean;
+
+ /** Enable/disable ANSI syntax highlighting of code frames. Default: `true`. */
+ highlightCode?: boolean;
+
+ /** List of presets (a set of plugins) to load and use. */
+ presets?: any[];
+
+ /** List of plugins to load and use. */
+ plugins?: any[];
+
+ /** list of glob paths to **not** compile. Opposite to the `only` option. */
+ ignore?: string[];
+
+ /**
+ * A glob, regex, or mixed array of both, matching paths to only compile. Can also be an array of arrays containing
+ * paths to explicitly match. When attempting to compile a non-matching file it's returned verbatim.
+ */
+ only?: string | RegExp | Array;
+
+ /** Enable code generation. Default: `true`. */
+ code?: boolean;
+
+ /** Include the AST in the returned object. Default: `true`. */
+ ast?: boolean;
+
+ /** A path to an .babelrc file to extend. */
+ extends?: string;
+
+ /** write comments to generated output. Default: `true`. */
+ comments?: boolean;
+
+ /**
+ * An optional callback that controls whether a comment should be output or not. Called as
+ * `shouldPrintComment(commentContents)`. **NOTE**: This overrides the `comments` option when used.
+ */
+ shouldPrintComment?: (comment: string) => boolean;
+
+ /**
+ * Do not include superfluous whitespace characters and line terminators. When set to `"auto"`, `compact` is set to
+ * `true` on input sizes of >100KB.
+ */
+ compact?: boolean | "auto";
+
+ /**
+ * If truthy, adds a `map` property to returned output. If set to `"inline"`, a comment with a `sourceMappingURL`
+ * directive is added to the bottom of the returned code. If set to `"both"` then a map property is returned as well
+ * as a source map comment appended.
+ */
+ sourceMaps?: boolean | "inline" | "both";
+
+ /** Set `file` on returned source map. */
+ sourceMapTarget?: string;
+
+ /** Set `sources[0]` on returned source map. */
+ sourceFileName?: string;
+
+ /** The root from which all sources are relative. */
+ sourceRoot?: string;
+
+ /** Specify whether or not to use `.babelrc` and `.babelignore` files. Default: `true`. */
+ babelrc?: boolean;
+
+ /** Attach a comment before all non-user injected code. */
+ auxiliaryCommentBefore?: string;
+
+ /** Attach a comment after all non-user injected code. */
+ auxiliaryCommentAfter?: string;
+
+ /**
+ * Specify a custom callback to generate a module id with. Called as `getModuleId(moduleName)`.
+ * If falsy value is returned then the generated module id is used.
+ */
+ getModuleId?: (moduleName: string) => string;
+
+ /** Optional prefix for the AMD module formatter that will be prepend to the filename on module definitions. */
+ moduleRoot?: string;
+
+ /**
+ * If truthy, insert an explicit id for modules. By default, all modules are anonymous.
+ * (Not available for `common` modules).
+ */
+ moduleIds?: boolean;
+
+ /** Specify a custom name for module ids. */
+ moduleId?: string;
+}
+
+export interface BabelFileResult {
+ ast?: Node;
+ code?: string;
+ map?: Object;
+}
+export as namespace babel;
+
diff --git a/typescript/hello-world/node_modules/@types/babel-core/package.json b/typescript/hello-world/node_modules/@types/babel-core/package.json
new file mode 100644
index 0000000..9ec551d
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-core/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "@types/babel-core",
+ "version": "6.7.14",
+ "description": "TypeScript definitions for babel-core v6.7",
+ "license": "MIT",
+ "author": "Troy Gerwien ",
+ "main": "",
+ "repository": {
+ "type": "git",
+ "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
+ },
+ "scripts": {},
+ "dependencies": {
+ "@types/babel-template": "*",
+ "@types/babel-traverse": "*",
+ "@types/babel-types": "*"
+ },
+ "typings": "index.d.ts",
+ "typesPublisherContentHash": "2d550befa083c32707f54767d78e1c72f420940facd52537e518d413e6de4b85"
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-core/types-metadata.json b/typescript/hello-world/node_modules/@types/babel-core/types-metadata.json
new file mode 100644
index 0000000..2ddda3b
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-core/types-metadata.json
@@ -0,0 +1,31 @@
+{
+ "authors": "Troy Gerwien ",
+ "definitionFilename": "index.d.ts",
+ "libraryDependencies": [
+ "babel-template",
+ "babel-traverse",
+ "babel-types"
+ ],
+ "moduleDependencies": [
+ "babel-template",
+ "babel-traverse",
+ "babel-types"
+ ],
+ "libraryMajorVersion": "6",
+ "libraryMinorVersion": "7",
+ "libraryName": "babel-core v6.7",
+ "typingsPackageName": "babel-core",
+ "projectName": "https://github.com/babel/babel/tree/master/packages/babel-core",
+ "sourceRepoURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped",
+ "sourceBranch": "types-2.0",
+ "kind": "UMD",
+ "globals": [
+ "babel"
+ ],
+ "declaredModules": [],
+ "files": [
+ "index.d.ts"
+ ],
+ "hasPackageJson": false,
+ "contentHash": "2d550befa083c32707f54767d78e1c72f420940facd52537e518d413e6de4b85"
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-template/README.md b/typescript/hello-world/node_modules/@types/babel-template/README.md
new file mode 100644
index 0000000..88d2477
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-template/README.md
@@ -0,0 +1,18 @@
+# Installation
+> `npm install --save @types/babel-template`
+
+# Summary
+This package contains type definitions for babel-template v6.7 (https://github.com/babel/babel/tree/master/packages/babel-template).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/types-2.0/babel-template
+
+Additional Details
+ * Last updated: Mon, 19 Sep 2016 16:15:22 GMT
+ * File structure: ProperModule
+ * Library Dependencies: babel-types, babylon
+ * Module Dependencies: babel-types, babylon
+ * Global values: template
+
+# Credits
+These definitions were written by Troy Gerwien .
diff --git a/typescript/hello-world/node_modules/@types/babel-template/index.d.ts b/typescript/hello-world/node_modules/@types/babel-template/index.d.ts
new file mode 100644
index 0000000..2a63f38
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-template/index.d.ts
@@ -0,0 +1,21 @@
+// Type definitions for babel-template v6.7
+// Project: https://github.com/babel/babel/tree/master/packages/babel-template
+// Definitions by: Troy Gerwien
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+///
+
+
+import {BabylonOptions} from 'babylon';
+import * as t from 'babel-types';
+type Node = t.Node;
+
+// NB: This export doesn't match the handbook example, where `template` is the default export.
+// But it does match the runtime behaviour (at least at the time of this writing). For some reason,
+// babel-template/lib/index.js has this line at the bottom: module.exports = exports["default"];
+export = template;
+declare function template(code: string, opts?: BabylonOptions): UseTemplate;
+
+type UseTemplate = (nodes?: {[placeholder: string]: Node}) => Node;
+
diff --git a/typescript/hello-world/node_modules/@types/babel-template/package.json b/typescript/hello-world/node_modules/@types/babel-template/package.json
new file mode 100644
index 0000000..0a625e5
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-template/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@types/babel-template",
+ "version": "6.7.14",
+ "description": "TypeScript definitions for babel-template v6.7",
+ "license": "MIT",
+ "author": "Troy Gerwien ",
+ "main": "",
+ "repository": {
+ "type": "git",
+ "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
+ },
+ "scripts": {},
+ "dependencies": {
+ "@types/babel-types": "*",
+ "@types/babylon": "*"
+ },
+ "typings": "index.d.ts",
+ "typesPublisherContentHash": "b2edf0adc14292f2295019657f7528acb6cbf0623848309478dbda97d6a615d1"
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-template/types-metadata.json b/typescript/hello-world/node_modules/@types/babel-template/types-metadata.json
new file mode 100644
index 0000000..531b6b5
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-template/types-metadata.json
@@ -0,0 +1,31 @@
+{
+ "authors": "Troy Gerwien ",
+ "definitionFilename": "index.d.ts",
+ "libraryDependencies": [
+ "babel-types",
+ "babylon"
+ ],
+ "moduleDependencies": [
+ "babel-types",
+ "babylon"
+ ],
+ "libraryMajorVersion": "6",
+ "libraryMinorVersion": "7",
+ "libraryName": "babel-template v6.7",
+ "typingsPackageName": "babel-template",
+ "projectName": "https://github.com/babel/babel/tree/master/packages/babel-template",
+ "sourceRepoURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped",
+ "sourceBranch": "types-2.0",
+ "kind": "ProperModule",
+ "globals": [
+ "template"
+ ],
+ "declaredModules": [
+ "babel-template"
+ ],
+ "files": [
+ "index.d.ts"
+ ],
+ "hasPackageJson": false,
+ "contentHash": "b2edf0adc14292f2295019657f7528acb6cbf0623848309478dbda97d6a615d1"
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-traverse/LICENSE b/typescript/hello-world/node_modules/@types/babel-traverse/LICENSE
new file mode 100644
index 0000000..4b1ad51
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-traverse/LICENSE
@@ -0,0 +1,21 @@
+ MIT License
+
+ Copyright (c) Microsoft Corporation. All rights reserved.
+
+ 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/typescript/hello-world/node_modules/@types/babel-traverse/README.md b/typescript/hello-world/node_modules/@types/babel-traverse/README.md
new file mode 100644
index 0000000..2ab0a90
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-traverse/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/babel-traverse`
+
+# Summary
+This package contains type definitions for babel-traverse (https://github.com/babel/babel/tree/master/packages/babel-traverse).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel-traverse
+
+Additional Details
+ * Last updated: Thu, 01 Jun 2017 03:25:51 GMT
+ * Dependencies: babel-types
+ * Global values: none
+
+# Credits
+These definitions were written by Troy Gerwien .
diff --git a/typescript/hello-world/node_modules/@types/babel-traverse/index.d.ts b/typescript/hello-world/node_modules/@types/babel-traverse/index.d.ts
new file mode 100644
index 0000000..ef2e6f0
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-traverse/index.d.ts
@@ -0,0 +1,966 @@
+// Type definitions for babel-traverse v6.7
+// Project: https://github.com/babel/babel/tree/master/packages/babel-traverse
+// Definitions by: Troy Gerwien
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+
+
+import * as t from 'babel-types';
+type Node = t.Node;
+
+export default function traverse(parent: Node | Node[], opts?: TraverseOptions, scope?: Scope, state?: any, parentPath?: NodePath): void;
+
+export interface TraverseOptions extends Visitor {
+ scope?: Scope;
+ noScope?: boolean;
+}
+
+export class Scope {
+ constructor(path: NodePath, parentScope?: Scope);
+ path: NodePath;
+ block: Node;
+ parentBlock: Node;
+ parent: Scope;
+ hub: Hub;
+ bindings: { [name: string]: Binding; };
+
+ /** Traverse node with current scope and path. */
+ traverse(node: Node | Node[], opts?: TraverseOptions, state?: any): void;
+
+ /** Generate a unique identifier and add it to the current scope. */
+ generateDeclaredUidIdentifier(name?: string): t.Identifier;
+
+ /** Generate a unique identifier. */
+ generateUidIdentifier(name?: string): t.Identifier;
+
+ /** Generate a unique `_id1` binding. */
+ generateUid(name?: string): string;
+
+ /** Generate a unique identifier based on a node. */
+ generateUidIdentifierBasedOnNode(parent: Node, defaultName?: string): t.Identifier;
+
+ /**
+ * Determine whether evaluating the specific input `node` is a consequenceless reference. ie.
+ * evaluating it wont result in potentially arbitrary code from being ran. The following are
+ * whitelisted and determined not to cause side effects:
+ *
+ * - `this` expressions
+ * - `super` expressions
+ * - Bound identifiers
+ */
+ isStatic(node: Node): boolean;
+
+ /** Possibly generate a memoised identifier if it is not static and has consequences. */
+ maybeGenerateMemoised(node: Node, dontPush?: boolean): t.Identifier;
+
+ checkBlockScopedCollisions(local: Node, kind: string, name: string, id: Object): void;
+
+ rename(oldName: string, newName?: string, block?: Node): void;
+
+ dump(): void;
+
+ toArray(node: Node, i?: number): Node;
+
+ registerDeclaration(path: NodePath): void;
+
+ buildUndefinedNode(): Node;
+
+ registerConstantViolation(path: NodePath): void;
+
+ registerBinding(kind: string, path: NodePath, bindingPath?: NodePath): void;
+
+ addGlobal(node: Node): void;
+
+ hasUid(name: string): boolean;
+
+ hasGlobal(name: string): boolean;
+
+ hasReference(name: string): boolean;
+
+ isPure(node: Node, constantsOnly?: boolean): boolean;
+
+ setData(key: string, val: any): any;
+
+ getData(key: string): any;
+
+ removeData(key: string): void;
+
+ push(opts: any): void;
+
+ getProgramParent(): Scope;
+
+ getFunctionParent(): Scope;
+
+ getBlockParent(): Scope;
+
+ /** Walks the scope tree and gathers **all** bindings. */
+ getAllBindings(...kinds: string[]): Object;
+
+ bindingIdentifierEquals(name: string, node: Node): boolean;
+
+ getBinding(name: string): Binding;
+
+ getOwnBinding(name: string): Binding;
+
+ getBindingIdentifier(name: string): t.Identifier;
+
+ getOwnBindingIdentifier(name: string): t.Identifier;
+
+ hasOwnBinding(name: string): boolean;
+
+ hasBinding(name: string, noGlobals?: boolean): boolean;
+
+ parentHasBinding(name: string, noGlobals?: boolean): boolean;
+
+ /** Move a binding of `name` to another `scope`. */
+ moveBindingTo(name: string, scope: Scope): void;
+
+ removeOwnBinding(name: string): void;
+
+ removeBinding(name: string): void;
+}
+
+export class Binding {
+ constructor(opts: { existing: Binding; identifier: t.Identifier; scope: Scope; path: NodePath; kind: 'var' | 'let' | 'const'; });
+ identifier: t.Identifier;
+ scope: Scope;
+ path: NodePath;
+ kind: 'var' | 'let' | 'const' | 'module';
+ referenced: boolean;
+ references: number;
+ referencePaths: NodePath[];
+ constant: boolean;
+ constantViolations: NodePath[];
+}
+
+export interface Visitor extends VisitNodeObject {
+ ArrayExpression?: VisitNode;
+ AssignmentExpression?: VisitNode;
+ LVal?: VisitNode;
+ Expression?: VisitNode;
+ BinaryExpression?: VisitNode;
+ Directive?: VisitNode;
+ DirectiveLiteral?: VisitNode;
+ BlockStatement?: VisitNode;
+ BreakStatement?: VisitNode;
+ Identifier?: VisitNode;
+ CallExpression?: VisitNode;
+ CatchClause?: VisitNode;
+ ConditionalExpression?: VisitNode;
+ ContinueStatement?: VisitNode;
+ DebuggerStatement?: VisitNode;
+ DoWhileStatement?: VisitNode;
+ Statement?: VisitNode;
+ EmptyStatement?: VisitNode;
+ ExpressionStatement?: VisitNode;
+ File?: VisitNode;
+ Program?: VisitNode;
+ ForInStatement?: VisitNode;
+ VariableDeclaration?: VisitNode;
+ ForStatement?: VisitNode;
+ FunctionDeclaration?: VisitNode;
+ FunctionExpression?: VisitNode;
+ IfStatement?: VisitNode;
+ LabeledStatement?: VisitNode;
+ StringLiteral?: VisitNode;
+ NumericLiteral?: VisitNode;
+ NullLiteral?: VisitNode;
+ BooleanLiteral?: VisitNode;
+ RegExpLiteral?: VisitNode;
+ LogicalExpression?: VisitNode;
+ MemberExpression?: VisitNode;
+ NewExpression?: VisitNode;
+ ObjectExpression?: VisitNode;
+ ObjectMethod?: VisitNode;
+ ObjectProperty?: VisitNode;
+ RestElement?: VisitNode;
+ ReturnStatement?: VisitNode;
+ SequenceExpression?: VisitNode;
+ SwitchCase?: VisitNode;
+ SwitchStatement?: VisitNode;
+ ThisExpression?: VisitNode;
+ ThrowStatement?: VisitNode;
+ TryStatement?: VisitNode;
+ UnaryExpression?: VisitNode;
+ UpdateExpression?: VisitNode;
+ VariableDeclarator?: VisitNode;
+ WhileStatement?: VisitNode;
+ WithStatement?: VisitNode;
+ AssignmentPattern?: VisitNode;
+ ArrayPattern?: VisitNode;
+ ArrowFunctionExpression?: VisitNode;
+ ClassBody?: VisitNode;
+ ClassDeclaration?: VisitNode;
+ ClassExpression?: VisitNode;
+ ExportAllDeclaration?: VisitNode;
+ ExportDefaultDeclaration?: VisitNode;
+ ExportNamedDeclaration?: VisitNode;
+ Declaration?: VisitNode;
+ ExportSpecifier?: VisitNode;
+ ForOfStatement?: VisitNode;
+ ImportDeclaration?: VisitNode;
+ ImportDefaultSpecifier?: VisitNode;
+ ImportNamespaceSpecifier?: VisitNode;
+ ImportSpecifier?: VisitNode;
+ MetaProperty?: VisitNode;
+ ClassMethod?: VisitNode;
+ ObjectPattern?: VisitNode;
+ SpreadElement?: VisitNode;
+ Super?: VisitNode;
+ TaggedTemplateExpression?: VisitNode;
+ TemplateLiteral?: VisitNode;
+ TemplateElement?: VisitNode;
+ YieldExpression?: VisitNode;
+ AnyTypeAnnotation?: VisitNode;
+ ArrayTypeAnnotation?: VisitNode;
+ BooleanTypeAnnotation?: VisitNode;
+ BooleanLiteralTypeAnnotation?: VisitNode;
+ NullLiteralTypeAnnotation?: VisitNode;
+ ClassImplements?: VisitNode;
+ ClassProperty?: VisitNode;
+ DeclareClass?: VisitNode;
+ DeclareFunction?: VisitNode;
+ DeclareInterface?: VisitNode;
+ DeclareModule?: VisitNode;
+ DeclareTypeAlias?: VisitNode;
+ DeclareVariable?: VisitNode;
+ ExistentialTypeParam?: VisitNode;
+ FunctionTypeAnnotation?: VisitNode;
+ FunctionTypeParam?: VisitNode;
+ GenericTypeAnnotation?: VisitNode;
+ InterfaceExtends?: VisitNode;
+ InterfaceDeclaration?: VisitNode;
+ IntersectionTypeAnnotation?: VisitNode;
+ MixedTypeAnnotation?: VisitNode;
+ NullableTypeAnnotation?: VisitNode;
+ NumericLiteralTypeAnnotation?: VisitNode;
+ NumberTypeAnnotation?: VisitNode;
+ StringLiteralTypeAnnotation?: VisitNode;
+ StringTypeAnnotation?: VisitNode;
+ ThisTypeAnnotation?: VisitNode;
+ TupleTypeAnnotation?: VisitNode;
+ TypeofTypeAnnotation?: VisitNode;
+ TypeAlias?: VisitNode;
+ TypeAnnotation?: VisitNode;
+ TypeCastExpression?: VisitNode;
+ TypeParameterDeclaration?: VisitNode;
+ TypeParameterInstantiation?: VisitNode;
+ ObjectTypeAnnotation?: VisitNode;
+ ObjectTypeCallProperty?: VisitNode;
+ ObjectTypeIndexer?: VisitNode;
+ ObjectTypeProperty?: VisitNode;
+ QualifiedTypeIdentifier?: VisitNode;
+ UnionTypeAnnotation?: VisitNode;
+ VoidTypeAnnotation?: VisitNode;
+ JSXAttribute?: VisitNode;
+ JSXIdentifier?: VisitNode;
+ JSXNamespacedName?: VisitNode;
+ JSXElement?: VisitNode;
+ JSXExpressionContainer?: VisitNode;
+ JSXClosingElement?: VisitNode;
+ JSXMemberExpression?: VisitNode;
+ JSXOpeningElement?: VisitNode;
+ JSXEmptyExpression?: VisitNode;
+ JSXSpreadAttribute?: VisitNode;
+ JSXText?: VisitNode;
+ Noop?: VisitNode;
+ ParenthesizedExpression?: VisitNode;
+ AwaitExpression?: VisitNode;
+ BindExpression?: VisitNode;
+ Decorator?: VisitNode;
+ DoExpression?: VisitNode;
+ ExportDefaultSpecifier?: VisitNode;
+ ExportNamespaceSpecifier?: VisitNode;
+ RestProperty?: VisitNode;
+ SpreadProperty?: VisitNode;
+ Binary?: VisitNode;
+ Scopable?: VisitNode;
+ BlockParent?: VisitNode;
+ Block?: VisitNode;
+ Terminatorless?: VisitNode;
+ CompletionStatement?: VisitNode;
+ Conditional?: VisitNode;
+ Loop?: VisitNode;
+ While?: VisitNode;
+ ExpressionWrapper?: VisitNode;
+ For?: VisitNode;
+ ForXStatement?: VisitNode;
+ Function?: VisitNode;
+ FunctionParent?: VisitNode;
+ Pureish?: VisitNode;
+ Literal?: VisitNode;
+ Immutable?: VisitNode;
+ UserWhitespacable?: VisitNode;
+ Method?: VisitNode;
+ ObjectMember?: VisitNode;
+ Property?: VisitNode;
+ UnaryLike?: VisitNode;
+ Pattern?: VisitNode;
+ Class?: VisitNode;
+ ModuleDeclaration?: VisitNode;
+ ExportDeclaration?: VisitNode;
+ ModuleSpecifier?: VisitNode;
+ Flow?: VisitNode;
+ FlowBaseAnnotation?: VisitNode;
+ FlowDeclaration?: VisitNode;
+ JSX?: VisitNode;
+ Scope?: VisitNode;
+}
+
+export type VisitNode = VisitNodeFunction | VisitNodeObject;
+
+export type VisitNodeFunction = (path: NodePath, state: any) => void;
+
+export interface VisitNodeObject {
+ enter?(path: NodePath, state: any): void;
+ exit?(path: NodePath, state: any): void;
+}
+
+export class NodePath {
+ constructor(hub: Hub, parent: Node);
+ parent: Node;
+ hub: Hub;
+ contexts: TraversalContext[];
+ data: Object;
+ shouldSkip: boolean;
+ shouldStop: boolean;
+ removed: boolean;
+ state: any;
+ opts: Object;
+ skipKeys: Object;
+ parentPath: NodePath;
+ context: TraversalContext;
+ container: Object | Object[];
+ listKey: string;
+ inList: boolean;
+ parentKey: string;
+ key: string;
+ node: T;
+ scope: Scope;
+ type: string;
+ typeAnnotation: Object;
+
+ getScope(scope: Scope): Scope;
+
+ setData(key: string, val: any): any;
+
+ getData(key: string, def?: any): any;
+
+ buildCodeFrameError(msg: string, Error?: new (msg: string) => TError): TError;
+
+ traverse(visitor: Visitor, state?: any): void;
+
+ set(key: string, node: Node): void;
+
+ getPathLocation(): string;
+
+ debug(buildMessage: Function): void;
+
+ // ------------------------- ancestry -------------------------
+ /**
+ * Call the provided `callback` with the `NodePath`s of all the parents.
+ * When the `callback` returns a truthy value, we return that node path.
+ */
+ findParent(callback: (path: NodePath) => boolean): NodePath;
+
+ find(callback: (path: NodePath) => boolean): NodePath;
+
+ /** Get the parent function of the current path. */
+ getFunctionParent(): NodePath;
+
+ /** Walk up the tree until we hit a parent node path in a list. */
+ getStatementParent(): NodePath;
+
+ /**
+ * Get the deepest common ancestor and then from it, get the earliest relationship path
+ * to that ancestor.
+ *
+ * Earliest is defined as being "before" all the other nodes in terms of list container
+ * position and visiting key.
+ */
+ getEarliestCommonAncestorFrom(paths: NodePath[]): NodePath;
+
+ /** Get the earliest path in the tree where the provided `paths` intersect. */
+ getDeepestCommonAncestorFrom(paths: NodePath[], filter?: Function): NodePath;
+
+ /**
+ * Build an array of node paths containing the entire ancestry of the current node path.
+ *
+ * NOTE: The current node path is included in this.
+ */
+ getAncestry(): NodePath[];
+
+ inType(...candidateTypes: string[]): boolean;
+
+ // ------------------------- inference -------------------------
+ /** Infer the type of the current `NodePath`. */
+ getTypeAnnotation(): t.FlowTypeAnnotation;
+
+ isBaseType(baseName: string, soft?: boolean): boolean;
+
+ couldBeBaseType(name: string): boolean;
+
+ baseTypeStrictlyMatches(right: NodePath): boolean;
+
+ isGenericType(genericName: string): boolean;
+
+ // ------------------------- replacement -------------------------
+ /**
+ * Replace a node with an array of multiple. This method performs the following steps:
+ *
+ * - Inherit the comments of first provided node with that of the current node.
+ * - Insert the provided nodes after the current node.
+ * - Remove the current node.
+ */
+ replaceWithMultiple(nodes: Node[]): void;
+
+ /**
+ * Parse a string as an expression and replace the current node with the result.
+ *
+ * NOTE: This is typically not a good idea to use. Building source strings when
+ * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's
+ * easier to use, your transforms will be extremely brittle.
+ */
+ replaceWithSourceString(replacement: any): void;
+
+ /** Replace the current node with another. */
+ replaceWith(replacement: Node | NodePath): void;
+
+ /**
+ * This method takes an array of statements nodes and then explodes it
+ * into expressions. This method retains completion records which is
+ * extremely important to retain original semantics.
+ */
+ replaceExpressionWithStatements(nodes: Node[]): Node;
+
+ replaceInline(nodes: Node | Node[]): void;
+
+ // ------------------------- evaluation -------------------------
+ /**
+ * Walk the input `node` and statically evaluate if it's truthy.
+ *
+ * Returning `true` when we're sure that the expression will evaluate to a
+ * truthy value, `false` if we're sure that it will evaluate to a falsy
+ * value and `undefined` if we aren't sure. Because of this please do not
+ * rely on coercion when using this method and check with === if it's false.
+ */
+ evaluateTruthy(): boolean;
+
+ /**
+ * Walk the input `node` and statically evaluate it.
+ *
+ * Returns an object in the form `{ confident, value }`. `confident` indicates
+ * whether or not we had to drop out of evaluating the expression because of
+ * hitting an unknown node that we couldn't confidently find the value of.
+ *
+ * Example:
+ *
+ * t.evaluate(parse("5 + 5")) // { confident: true, value: 10 }
+ * t.evaluate(parse("!true")) // { confident: true, value: false }
+ * t.evaluate(parse("foo + foo")) // { confident: false, value: undefined }
+ */
+ evaluate(): { confident: boolean; value: any };
+
+ // ------------------------- introspection -------------------------
+ /**
+ * Match the current node if it matches the provided `pattern`.
+ *
+ * For example, given the match `React.createClass` it would match the
+ * parsed nodes of `React.createClass` and `React["createClass"]`.
+ */
+ matchesPattern(pattern: string, allowPartial?: boolean): boolean;
+
+ /**
+ * Check whether we have the input `key`. If the `key` references an array then we check
+ * if the array has any items, otherwise we just check if it's falsy.
+ */
+ has(key: string): boolean;
+
+ isStatic(): boolean;
+
+ /** Alias of `has`. */
+ is(key: string): boolean;
+
+ /** Opposite of `has`. */
+ isnt(key: string): boolean;
+
+ /** Check whether the path node `key` strict equals `value`. */
+ equals(key: string, value: any): boolean;
+
+ /**
+ * Check the type against our stored internal type of the node. This is handy when a node has
+ * been removed yet we still internally know the type and need it to calculate node replacement.
+ */
+ isNodeType(type: string): boolean;
+
+ /**
+ * This checks whether or not we're in one of the following positions:
+ *
+ * for (KEY in right);
+ * for (KEY;;);
+ *
+ * This is because these spots allow VariableDeclarations AND normal expressions so we need
+ * to tell the path replacement that it's ok to replace this with an expression.
+ */
+ canHaveVariableDeclarationOrExpression(): boolean;
+
+ /**
+ * This checks whether we are swapping an arrow function's body between an
+ * expression and a block statement (or vice versa).
+ *
+ * This is because arrow functions may implicitly return an expression, which
+ * is the same as containing a block statement.
+ */
+ canSwapBetweenExpressionAndStatement(replacement: Node): boolean;
+
+ /** Check whether the current path references a completion record */
+ isCompletionRecord(allowInsideFunction?: boolean): boolean;
+
+ /**
+ * Check whether or not the current `key` allows either a single statement or block statement
+ * so we can explode it if necessary.
+ */
+ isStatementOrBlock(): boolean;
+
+ /** Check if the currently assigned path references the `importName` of `moduleSource`. */
+ referencesImport(moduleSource: string, importName: string): boolean;
+
+ /** Get the source code associated with this node. */
+ getSource(): string;
+
+ // ------------------------- context -------------------------
+ call(key: string): boolean;
+
+ isBlacklisted(): boolean;
+
+ visit(): boolean;
+
+ skip(): void;
+
+ skipKey(key: string): void;
+
+ stop(): void;
+
+ setScope(): void;
+
+ setContext(context: TraversalContext): NodePath;
+
+ popContext(): void;
+
+ pushContext(context: TraversalContext): void;
+
+ // ------------------------- removal -------------------------
+ remove(): void;
+
+ // ------------------------- modification -------------------------
+ /** Insert the provided nodes before the current one. */
+ insertBefore(nodes: Node | Node[]): any;
+
+ /**
+ * Insert the provided nodes after the current one. When inserting nodes after an
+ * expression, ensure that the completion record is correct by pushing the current node.
+ */
+ insertAfter(nodes: Node | Node[]): any;
+
+ /** Update all sibling node paths after `fromIndex` by `incrementBy`. */
+ updateSiblingKeys(fromIndex: number, incrementBy: number): void;
+
+ /** Hoist the current node to the highest scope possible and return a UID referencing it. */
+ hoist(scope: Scope): void;
+
+ // ------------------------- family -------------------------
+ getStatementParent(): NodePath;
+
+ getOpposite(): NodePath;
+
+ getCompletionRecords(): NodePath[];
+
+ getSibling(key: string): NodePath;
+
+ get(key: string, context?: boolean | TraversalContext): NodePath;
+
+ getBindingIdentifiers(duplicates?: boolean): Node[];
+
+ getOuterBindingIdentifiers(duplicates?: boolean): Node[];
+
+ // ------------------------- comments -------------------------
+ /** Share comments amongst siblings. */
+ shareCommentsWithSiblings(): void;
+
+ addComment(type: string, content: string, line?: boolean): void;
+
+ /** Give node `comments` of the specified `type`. */
+ addComments(type: string, comments: any[]): void;
+
+ // ------------------------- isXXX -------------------------
+ isArrayExpression(opts?: Object): boolean;
+ isAssignmentExpression(opts?: Object): boolean;
+ isBinaryExpression(opts?: Object): boolean;
+ isDirective(opts?: Object): boolean;
+ isDirectiveLiteral(opts?: Object): boolean;
+ isBlockStatement(opts?: Object): boolean;
+ isBreakStatement(opts?: Object): boolean;
+ isCallExpression(opts?: Object): boolean;
+ isCatchClause(opts?: Object): boolean;
+ isConditionalExpression(opts?: Object): boolean;
+ isContinueStatement(opts?: Object): boolean;
+ isDebuggerStatement(opts?: Object): boolean;
+ isDoWhileStatement(opts?: Object): boolean;
+ isEmptyStatement(opts?: Object): boolean;
+ isExpressionStatement(opts?: Object): boolean;
+ isFile(opts?: Object): boolean;
+ isForInStatement(opts?: Object): boolean;
+ isForStatement(opts?: Object): boolean;
+ isFunctionDeclaration(opts?: Object): boolean;
+ isFunctionExpression(opts?: Object): boolean;
+ isIdentifier(opts?: Object): boolean;
+ isIfStatement(opts?: Object): boolean;
+ isLabeledStatement(opts?: Object): boolean;
+ isStringLiteral(opts?: Object): boolean;
+ isNumericLiteral(opts?: Object): boolean;
+ isNullLiteral(opts?: Object): boolean;
+ isBooleanLiteral(opts?: Object): boolean;
+ isRegExpLiteral(opts?: Object): boolean;
+ isLogicalExpression(opts?: Object): boolean;
+ isMemberExpression(opts?: Object): boolean;
+ isNewExpression(opts?: Object): boolean;
+ isProgram(opts?: Object): boolean;
+ isObjectExpression(opts?: Object): boolean;
+ isObjectMethod(opts?: Object): boolean;
+ isObjectProperty(opts?: Object): boolean;
+ isRestElement(opts?: Object): boolean;
+ isReturnStatement(opts?: Object): boolean;
+ isSequenceExpression(opts?: Object): boolean;
+ isSwitchCase(opts?: Object): boolean;
+ isSwitchStatement(opts?: Object): boolean;
+ isThisExpression(opts?: Object): boolean;
+ isThrowStatement(opts?: Object): boolean;
+ isTryStatement(opts?: Object): boolean;
+ isUnaryExpression(opts?: Object): boolean;
+ isUpdateExpression(opts?: Object): boolean;
+ isVariableDeclaration(opts?: Object): boolean;
+ isVariableDeclarator(opts?: Object): boolean;
+ isWhileStatement(opts?: Object): boolean;
+ isWithStatement(opts?: Object): boolean;
+ isAssignmentPattern(opts?: Object): boolean;
+ isArrayPattern(opts?: Object): boolean;
+ isArrowFunctionExpression(opts?: Object): boolean;
+ isClassBody(opts?: Object): boolean;
+ isClassDeclaration(opts?: Object): boolean;
+ isClassExpression(opts?: Object): boolean;
+ isExportAllDeclaration(opts?: Object): boolean;
+ isExportDefaultDeclaration(opts?: Object): boolean;
+ isExportNamedDeclaration(opts?: Object): boolean;
+ isExportSpecifier(opts?: Object): boolean;
+ isForOfStatement(opts?: Object): boolean;
+ isImportDeclaration(opts?: Object): boolean;
+ isImportDefaultSpecifier(opts?: Object): boolean;
+ isImportNamespaceSpecifier(opts?: Object): boolean;
+ isImportSpecifier(opts?: Object): boolean;
+ isMetaProperty(opts?: Object): boolean;
+ isClassMethod(opts?: Object): boolean;
+ isObjectPattern(opts?: Object): boolean;
+ isSpreadElement(opts?: Object): boolean;
+ isSuper(opts?: Object): boolean;
+ isTaggedTemplateExpression(opts?: Object): boolean;
+ isTemplateElement(opts?: Object): boolean;
+ isTemplateLiteral(opts?: Object): boolean;
+ isYieldExpression(opts?: Object): boolean;
+ isAnyTypeAnnotation(opts?: Object): boolean;
+ isArrayTypeAnnotation(opts?: Object): boolean;
+ isBooleanTypeAnnotation(opts?: Object): boolean;
+ isBooleanLiteralTypeAnnotation(opts?: Object): boolean;
+ isNullLiteralTypeAnnotation(opts?: Object): boolean;
+ isClassImplements(opts?: Object): boolean;
+ isClassProperty(opts?: Object): boolean;
+ isDeclareClass(opts?: Object): boolean;
+ isDeclareFunction(opts?: Object): boolean;
+ isDeclareInterface(opts?: Object): boolean;
+ isDeclareModule(opts?: Object): boolean;
+ isDeclareTypeAlias(opts?: Object): boolean;
+ isDeclareVariable(opts?: Object): boolean;
+ isExistentialTypeParam(opts?: Object): boolean;
+ isFunctionTypeAnnotation(opts?: Object): boolean;
+ isFunctionTypeParam(opts?: Object): boolean;
+ isGenericTypeAnnotation(opts?: Object): boolean;
+ isInterfaceExtends(opts?: Object): boolean;
+ isInterfaceDeclaration(opts?: Object): boolean;
+ isIntersectionTypeAnnotation(opts?: Object): boolean;
+ isMixedTypeAnnotation(opts?: Object): boolean;
+ isNullableTypeAnnotation(opts?: Object): boolean;
+ isNumericLiteralTypeAnnotation(opts?: Object): boolean;
+ isNumberTypeAnnotation(opts?: Object): boolean;
+ isStringLiteralTypeAnnotation(opts?: Object): boolean;
+ isStringTypeAnnotation(opts?: Object): boolean;
+ isThisTypeAnnotation(opts?: Object): boolean;
+ isTupleTypeAnnotation(opts?: Object): boolean;
+ isTypeofTypeAnnotation(opts?: Object): boolean;
+ isTypeAlias(opts?: Object): boolean;
+ isTypeAnnotation(opts?: Object): boolean;
+ isTypeCastExpression(opts?: Object): boolean;
+ isTypeParameterDeclaration(opts?: Object): boolean;
+ isTypeParameterInstantiation(opts?: Object): boolean;
+ isObjectTypeAnnotation(opts?: Object): boolean;
+ isObjectTypeCallProperty(opts?: Object): boolean;
+ isObjectTypeIndexer(opts?: Object): boolean;
+ isObjectTypeProperty(opts?: Object): boolean;
+ isQualifiedTypeIdentifier(opts?: Object): boolean;
+ isUnionTypeAnnotation(opts?: Object): boolean;
+ isVoidTypeAnnotation(opts?: Object): boolean;
+ isJSXAttribute(opts?: Object): boolean;
+ isJSXClosingElement(opts?: Object): boolean;
+ isJSXElement(opts?: Object): boolean;
+ isJSXEmptyExpression(opts?: Object): boolean;
+ isJSXExpressionContainer(opts?: Object): boolean;
+ isJSXIdentifier(opts?: Object): boolean;
+ isJSXMemberExpression(opts?: Object): boolean;
+ isJSXNamespacedName(opts?: Object): boolean;
+ isJSXOpeningElement(opts?: Object): boolean;
+ isJSXSpreadAttribute(opts?: Object): boolean;
+ isJSXText(opts?: Object): boolean;
+ isNoop(opts?: Object): boolean;
+ isParenthesizedExpression(opts?: Object): boolean;
+ isAwaitExpression(opts?: Object): boolean;
+ isBindExpression(opts?: Object): boolean;
+ isDecorator(opts?: Object): boolean;
+ isDoExpression(opts?: Object): boolean;
+ isExportDefaultSpecifier(opts?: Object): boolean;
+ isExportNamespaceSpecifier(opts?: Object): boolean;
+ isRestProperty(opts?: Object): boolean;
+ isSpreadProperty(opts?: Object): boolean;
+ isExpression(opts?: Object): boolean;
+ isBinary(opts?: Object): boolean;
+ isScopable(opts?: Object): boolean;
+ isBlockParent(opts?: Object): boolean;
+ isBlock(opts?: Object): boolean;
+ isStatement(opts?: Object): boolean;
+ isTerminatorless(opts?: Object): boolean;
+ isCompletionStatement(opts?: Object): boolean;
+ isConditional(opts?: Object): boolean;
+ isLoop(opts?: Object): boolean;
+ isWhile(opts?: Object): boolean;
+ isExpressionWrapper(opts?: Object): boolean;
+ isFor(opts?: Object): boolean;
+ isForXStatement(opts?: Object): boolean;
+ isFunction(opts?: Object): boolean;
+ isFunctionParent(opts?: Object): boolean;
+ isPureish(opts?: Object): boolean;
+ isDeclaration(opts?: Object): boolean;
+ isLVal(opts?: Object): boolean;
+ isLiteral(opts?: Object): boolean;
+ isImmutable(opts?: Object): boolean;
+ isUserWhitespacable(opts?: Object): boolean;
+ isMethod(opts?: Object): boolean;
+ isObjectMember(opts?: Object): boolean;
+ isProperty(opts?: Object): boolean;
+ isUnaryLike(opts?: Object): boolean;
+ isPattern(opts?: Object): boolean;
+ isClass(opts?: Object): boolean;
+ isModuleDeclaration(opts?: Object): boolean;
+ isExportDeclaration(opts?: Object): boolean;
+ isModuleSpecifier(opts?: Object): boolean;
+ isFlow(opts?: Object): boolean;
+ isFlowBaseAnnotation(opts?: Object): boolean;
+ isFlowDeclaration(opts?: Object): boolean;
+ isJSX(opts?: Object): boolean;
+ isNumberLiteral(opts?: Object): boolean;
+ isRegexLiteral(opts?: Object): boolean;
+ isReferencedIdentifier(opts?: Object): boolean;
+ isReferencedMemberExpression(opts?: Object): boolean;
+ isBindingIdentifier(opts?: Object): boolean;
+ isScope(opts?: Object): boolean;
+ isReferenced(opts?: Object): boolean;
+ isBlockScoped(opts?: Object): boolean;
+ isVar(opts?: Object): boolean;
+ isUser(opts?: Object): boolean;
+ isGenerated(opts?: Object): boolean;
+ isPure(opts?: Object): boolean;
+
+ // ------------------------- assertXXX -------------------------
+ assertArrayExpression(opts?: Object): void;
+ assertAssignmentExpression(opts?: Object): void;
+ assertBinaryExpression(opts?: Object): void;
+ assertDirective(opts?: Object): void;
+ assertDirectiveLiteral(opts?: Object): void;
+ assertBlockStatement(opts?: Object): void;
+ assertBreakStatement(opts?: Object): void;
+ assertCallExpression(opts?: Object): void;
+ assertCatchClause(opts?: Object): void;
+ assertConditionalExpression(opts?: Object): void;
+ assertContinueStatement(opts?: Object): void;
+ assertDebuggerStatement(opts?: Object): void;
+ assertDoWhileStatement(opts?: Object): void;
+ assertEmptyStatement(opts?: Object): void;
+ assertExpressionStatement(opts?: Object): void;
+ assertFile(opts?: Object): void;
+ assertForInStatement(opts?: Object): void;
+ assertForStatement(opts?: Object): void;
+ assertFunctionDeclaration(opts?: Object): void;
+ assertFunctionExpression(opts?: Object): void;
+ assertIdentifier(opts?: Object): void;
+ assertIfStatement(opts?: Object): void;
+ assertLabeledStatement(opts?: Object): void;
+ assertStringLiteral(opts?: Object): void;
+ assertNumericLiteral(opts?: Object): void;
+ assertNullLiteral(opts?: Object): void;
+ assertBooleanLiteral(opts?: Object): void;
+ assertRegExpLiteral(opts?: Object): void;
+ assertLogicalExpression(opts?: Object): void;
+ assertMemberExpression(opts?: Object): void;
+ assertNewExpression(opts?: Object): void;
+ assertProgram(opts?: Object): void;
+ assertObjectExpression(opts?: Object): void;
+ assertObjectMethod(opts?: Object): void;
+ assertObjectProperty(opts?: Object): void;
+ assertRestElement(opts?: Object): void;
+ assertReturnStatement(opts?: Object): void;
+ assertSequenceExpression(opts?: Object): void;
+ assertSwitchCase(opts?: Object): void;
+ assertSwitchStatement(opts?: Object): void;
+ assertThisExpression(opts?: Object): void;
+ assertThrowStatement(opts?: Object): void;
+ assertTryStatement(opts?: Object): void;
+ assertUnaryExpression(opts?: Object): void;
+ assertUpdateExpression(opts?: Object): void;
+ assertVariableDeclaration(opts?: Object): void;
+ assertVariableDeclarator(opts?: Object): void;
+ assertWhileStatement(opts?: Object): void;
+ assertWithStatement(opts?: Object): void;
+ assertAssignmentPattern(opts?: Object): void;
+ assertArrayPattern(opts?: Object): void;
+ assertArrowFunctionExpression(opts?: Object): void;
+ assertClassBody(opts?: Object): void;
+ assertClassDeclaration(opts?: Object): void;
+ assertClassExpression(opts?: Object): void;
+ assertExportAllDeclaration(opts?: Object): void;
+ assertExportDefaultDeclaration(opts?: Object): void;
+ assertExportNamedDeclaration(opts?: Object): void;
+ assertExportSpecifier(opts?: Object): void;
+ assertForOfStatement(opts?: Object): void;
+ assertImportDeclaration(opts?: Object): void;
+ assertImportDefaultSpecifier(opts?: Object): void;
+ assertImportNamespaceSpecifier(opts?: Object): void;
+ assertImportSpecifier(opts?: Object): void;
+ assertMetaProperty(opts?: Object): void;
+ assertClassMethod(opts?: Object): void;
+ assertObjectPattern(opts?: Object): void;
+ assertSpreadElement(opts?: Object): void;
+ assertSuper(opts?: Object): void;
+ assertTaggedTemplateExpression(opts?: Object): void;
+ assertTemplateElement(opts?: Object): void;
+ assertTemplateLiteral(opts?: Object): void;
+ assertYieldExpression(opts?: Object): void;
+ assertAnyTypeAnnotation(opts?: Object): void;
+ assertArrayTypeAnnotation(opts?: Object): void;
+ assertBooleanTypeAnnotation(opts?: Object): void;
+ assertBooleanLiteralTypeAnnotation(opts?: Object): void;
+ assertNullLiteralTypeAnnotation(opts?: Object): void;
+ assertClassImplements(opts?: Object): void;
+ assertClassProperty(opts?: Object): void;
+ assertDeclareClass(opts?: Object): void;
+ assertDeclareFunction(opts?: Object): void;
+ assertDeclareInterface(opts?: Object): void;
+ assertDeclareModule(opts?: Object): void;
+ assertDeclareTypeAlias(opts?: Object): void;
+ assertDeclareVariable(opts?: Object): void;
+ assertExistentialTypeParam(opts?: Object): void;
+ assertFunctionTypeAnnotation(opts?: Object): void;
+ assertFunctionTypeParam(opts?: Object): void;
+ assertGenericTypeAnnotation(opts?: Object): void;
+ assertInterfaceExtends(opts?: Object): void;
+ assertInterfaceDeclaration(opts?: Object): void;
+ assertIntersectionTypeAnnotation(opts?: Object): void;
+ assertMixedTypeAnnotation(opts?: Object): void;
+ assertNullableTypeAnnotation(opts?: Object): void;
+ assertNumericLiteralTypeAnnotation(opts?: Object): void;
+ assertNumberTypeAnnotation(opts?: Object): void;
+ assertStringLiteralTypeAnnotation(opts?: Object): void;
+ assertStringTypeAnnotation(opts?: Object): void;
+ assertThisTypeAnnotation(opts?: Object): void;
+ assertTupleTypeAnnotation(opts?: Object): void;
+ assertTypeofTypeAnnotation(opts?: Object): void;
+ assertTypeAlias(opts?: Object): void;
+ assertTypeAnnotation(opts?: Object): void;
+ assertTypeCastExpression(opts?: Object): void;
+ assertTypeParameterDeclaration(opts?: Object): void;
+ assertTypeParameterInstantiation(opts?: Object): void;
+ assertObjectTypeAnnotation(opts?: Object): void;
+ assertObjectTypeCallProperty(opts?: Object): void;
+ assertObjectTypeIndexer(opts?: Object): void;
+ assertObjectTypeProperty(opts?: Object): void;
+ assertQualifiedTypeIdentifier(opts?: Object): void;
+ assertUnionTypeAnnotation(opts?: Object): void;
+ assertVoidTypeAnnotation(opts?: Object): void;
+ assertJSXAttribute(opts?: Object): void;
+ assertJSXClosingElement(opts?: Object): void;
+ assertJSXElement(opts?: Object): void;
+ assertJSXEmptyExpression(opts?: Object): void;
+ assertJSXExpressionContainer(opts?: Object): void;
+ assertJSXIdentifier(opts?: Object): void;
+ assertJSXMemberExpression(opts?: Object): void;
+ assertJSXNamespacedName(opts?: Object): void;
+ assertJSXOpeningElement(opts?: Object): void;
+ assertJSXSpreadAttribute(opts?: Object): void;
+ assertJSXText(opts?: Object): void;
+ assertNoop(opts?: Object): void;
+ assertParenthesizedExpression(opts?: Object): void;
+ assertAwaitExpression(opts?: Object): void;
+ assertBindExpression(opts?: Object): void;
+ assertDecorator(opts?: Object): void;
+ assertDoExpression(opts?: Object): void;
+ assertExportDefaultSpecifier(opts?: Object): void;
+ assertExportNamespaceSpecifier(opts?: Object): void;
+ assertRestProperty(opts?: Object): void;
+ assertSpreadProperty(opts?: Object): void;
+ assertExpression(opts?: Object): void;
+ assertBinary(opts?: Object): void;
+ assertScopable(opts?: Object): void;
+ assertBlockParent(opts?: Object): void;
+ assertBlock(opts?: Object): void;
+ assertStatement(opts?: Object): void;
+ assertTerminatorless(opts?: Object): void;
+ assertCompletionStatement(opts?: Object): void;
+ assertConditional(opts?: Object): void;
+ assertLoop(opts?: Object): void;
+ assertWhile(opts?: Object): void;
+ assertExpressionWrapper(opts?: Object): void;
+ assertFor(opts?: Object): void;
+ assertForXStatement(opts?: Object): void;
+ assertFunction(opts?: Object): void;
+ assertFunctionParent(opts?: Object): void;
+ assertPureish(opts?: Object): void;
+ assertDeclaration(opts?: Object): void;
+ assertLVal(opts?: Object): void;
+ assertLiteral(opts?: Object): void;
+ assertImmutable(opts?: Object): void;
+ assertUserWhitespacable(opts?: Object): void;
+ assertMethod(opts?: Object): void;
+ assertObjectMember(opts?: Object): void;
+ assertProperty(opts?: Object): void;
+ assertUnaryLike(opts?: Object): void;
+ assertPattern(opts?: Object): void;
+ assertClass(opts?: Object): void;
+ assertModuleDeclaration(opts?: Object): void;
+ assertExportDeclaration(opts?: Object): void;
+ assertModuleSpecifier(opts?: Object): void;
+ assertFlow(opts?: Object): void;
+ assertFlowBaseAnnotation(opts?: Object): void;
+ assertFlowDeclaration(opts?: Object): void;
+ assertJSX(opts?: Object): void;
+ assertNumberLiteral(opts?: Object): void;
+ assertRegexLiteral(opts?: Object): void;
+}
+
+export class Hub {
+ constructor(file: any, options: any);
+ file: any;
+ options: any;
+}
+
+interface TraversalContext {
+ parentPath: NodePath;
+ scope: Scope;
+ state: any;
+ opts: any;
+}
diff --git a/typescript/hello-world/node_modules/@types/babel-traverse/package.json b/typescript/hello-world/node_modules/@types/babel-traverse/package.json
new file mode 100644
index 0000000..2da8446
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-traverse/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@types/babel-traverse",
+ "version": "6.7.17",
+ "description": "TypeScript definitions for babel-traverse",
+ "license": "MIT",
+ "contributors": [
+ {
+ "name": "Troy Gerwien",
+ "url": "https://github.com/yortus"
+ }
+ ],
+ "main": "",
+ "repository": {
+ "type": "git",
+ "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
+ },
+ "scripts": {},
+ "dependencies": {
+ "@types/babel-types": "*"
+ },
+ "peerDependencies": {},
+ "typesPublisherContentHash": "8e50dc505a31639d76b209314a366d3a228edfdf7828e869f71a7ee13634cf38",
+ "typeScriptVersion": "2.0"
+}
\ No newline at end of file
diff --git a/typescript/hello-world/node_modules/@types/babel-types/LICENSE b/typescript/hello-world/node_modules/@types/babel-types/LICENSE
new file mode 100644
index 0000000..4b1ad51
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-types/LICENSE
@@ -0,0 +1,21 @@
+ MIT License
+
+ Copyright (c) Microsoft Corporation. All rights reserved.
+
+ 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/typescript/hello-world/node_modules/@types/babel-types/README.md b/typescript/hello-world/node_modules/@types/babel-types/README.md
new file mode 100644
index 0000000..6806fbd
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-types/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/babel-types`
+
+# Summary
+This package contains type definitions for babel-types (https://github.com/babel/babel/tree/master/packages/babel-types).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel-types
+
+Additional Details
+ * Last updated: Fri, 05 May 2017 01:18:21 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by Troy Gerwien , Sam Baxter .
diff --git a/typescript/hello-world/node_modules/@types/babel-types/index.d.ts b/typescript/hello-world/node_modules/@types/babel-types/index.d.ts
new file mode 100644
index 0000000..c1e8354
--- /dev/null
+++ b/typescript/hello-world/node_modules/@types/babel-types/index.d.ts
@@ -0,0 +1,1401 @@
+// Type definitions for babel-types v6.7
+// Project: https://github.com/babel/babel/tree/master/packages/babel-types
+// Definitions by: Troy Gerwien , Sam Baxter
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+export interface Comment {
+ value: string;
+ start: number;
+ end: number;
+ loc: SourceLocation;
+}
+
+export interface CommentBlock extends Comment {
+ type: "CommentBlock";
+}
+
+export interface CommentLine extends Comment {
+ type: "CommentLine";
+}
+
+export interface SourceLocation {
+ start: {
+ line: number;
+ column: number;
+ };
+
+ end: {
+ line: number;
+ column: number;
+ };
+}
+
+export interface Node {
+ type: string;
+ leadingComments?: Array;
+ innerComments?: Array;
+ trailingComments?: Array;
+ start: number;
+ end: number;
+ loc: SourceLocation;
+}
+
+export interface ArrayExpression extends Node {
+ type: "ArrayExpression";
+ elements: Array;
+}
+
+export interface AssignmentExpression extends Node {
+ type: "AssignmentExpression";
+ operator: "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=";
+ left: LVal;
+ right: Expression;
+}
+
+export interface BinaryExpression extends Node {
+ type: "BinaryExpression";
+ operator: "+" | "-" | "/" | "%" | "*" | "**" | "&" | "|" | ">>" | ">>>" | "<<" | "^" | "==" | "===" | "!=" | "!==" | "in" | "instanceof" | ">" | "<" | ">=" | "<=";
+ left: Expression;
+ right: Expression;
+}
+
+export interface Directive extends Node {
+ type: "Directive";
+ value: DirectiveLiteral;
+}
+
+export interface DirectiveLiteral extends Node {
+ type: "DirectiveLiteral";
+ value: string;
+}
+
+export interface BlockStatement extends Node {
+ type: "BlockStatement";
+ directives?: Directive[];
+ body: Statement[];
+}
+
+export interface BreakStatement extends Node {
+ type: "BreakStatement";
+ label: Identifier;
+}
+
+export interface CallExpression extends Node {
+ type: "CallExpression";
+ callee: Expression | Super;
+ arguments: Array;
+}
+
+export interface CatchClause extends Node {
+ type: "CatchClause";
+ param: Identifier;
+ body: BlockStatement;
+}
+
+export interface ConditionalExpression extends Node {
+ type: "ConditionalExpression";
+ test: Expression;
+ consequent: Expression;
+ alternate: Expression;
+}
+
+export interface ContinueStatement extends Node {
+ type: "ContinueStatement";
+ label: Identifier;
+}
+
+export interface DebuggerStatement extends Node {
+ type: "DebuggerStatement";
+}
+
+export interface DoWhileStatement extends Node {
+ type: "DoWhileStatement";
+ test: Expression;
+ body: Statement;
+}
+
+export interface EmptyStatement extends Node {
+ type: "EmptyStatement";
+}
+
+export interface ExpressionStatement extends Node {
+ type: "ExpressionStatement";
+ expression: Expression;
+}
+
+export interface File extends Node {
+ type: "File";
+ program: Program;
+ comments: Comment[];
+ tokens: any[];
+}
+
+export interface ForInStatement extends Node {
+ type: "ForInStatement";
+ left: VariableDeclaration | LVal;
+ right: Expression;
+ body: Statement;
+}
+
+export interface ForStatement extends Node {
+ type: "ForStatement";
+ init: VariableDeclaration | Expression;
+ test: Expression;
+ update: Expression;
+ body: Statement;
+}
+
+export interface FunctionDeclaration extends Node {
+ type: "FunctionDeclaration";
+ id: Identifier;
+ params: Array;
+ body: BlockStatement;
+ generator: boolean;
+ async: boolean;
+ returnType?: TypeAnnotation;
+ typeParameters?: TypeParameterDeclaration;
+}
+
+export interface FunctionExpression extends Node {
+ type: "FunctionExpression";
+ id: Identifier;
+ params: Array;
+ body: BlockStatement;
+ generator: boolean;
+ async: boolean;
+ returnType?: TypeAnnotation;
+ typeParameters?: TypeParameterDeclaration;
+}
+
+export interface Identifier extends Node {
+ type: "Identifier";
+ name: string;
+ typeAnnotation?: TypeAnnotation;
+}
+
+export interface IfStatement extends Node {
+ type: "IfStatement";
+ test: Expression;
+ consequent: Statement;
+ alternate: Statement;
+}
+
+export interface LabeledStatement extends Node {
+ type: "LabeledStatement";
+ label: Identifier;
+ body: Statement;
+}
+
+export interface StringLiteral extends Node {
+ type: "StringLiteral";
+ value: string;
+}
+
+export interface NumericLiteral extends Node {
+ type: "NumericLiteral";
+ value: number;
+}
+
+export interface NullLiteral extends Node {
+ type: "NullLiteral";
+}
+
+export interface BooleanLiteral extends Node {
+ type: "BooleanLiteral";
+ value: boolean;
+}
+
+export interface RegExpLiteral extends Node {
+ type: "RegExpLiteral";
+ pattern: string;
+ flags?: string;
+}
+
+export interface LogicalExpression extends Node {
+ type: "LogicalExpression";
+ operator: "||" | "&&";
+ left: Expression;
+ right: Expression;
+}
+
+export interface MemberExpression extends Node {
+ type: "MemberExpression";
+ object: Expression | Super;
+ property: Expression;
+ computed: boolean;
+}
+
+export interface NewExpression extends Node {
+ type: "NewExpression";
+ callee: Expression | Super;
+ arguments: Array;
+}
+
+export interface Program extends Node {
+ type: "Program";
+ sourceType: "script" | "module";
+ directives?: Directive[];
+ body: Array;
+}
+
+export interface ObjectExpression extends Node {
+ type: "ObjectExpression";
+ properties: Array;
+}
+
+export interface ObjectMethod extends Node {
+ type: "ObjectMethod";
+ key: Expression;
+ kind: "get" | "set" | "method";
+ shorthand: boolean;
+ computed: boolean;
+ value: Expression;
+ decorators?: Decorator[];
+ id: Identifier;
+ params: Array;
+ body: BlockStatement;
+ generator: boolean;
+ async: boolean;
+ returnType?: TypeAnnotation;
+ typeParameters?: TypeParameterDeclaration;
+}
+
+export interface ObjectProperty extends Node {
+ type: "ObjectProperty";
+ key: Expression;
+ computed: boolean;
+ value: Expression;
+ decorators?: Decorator[];
+ shorthand: boolean;
+}
+
+export interface RestElement extends Node {
+ type: "RestElement";
+ argument: LVal;
+ typeAnnotation?: TypeAnnotation;
+}
+
+export interface ReturnStatement extends Node {
+ type: "ReturnStatement";
+ argument: Expression;
+}
+
+export interface SequenceExpression extends Node {
+ type: "SequenceExpression";
+ expressions: Expression[];
+}
+
+export interface SwitchCase extends Node {
+ type: "SwitchCase";
+ test: Expression;
+ consequent: Statement[];
+}
+
+export interface SwitchStatement extends Node {
+ type: "SwitchStatement";
+ discriminant: Expression;
+ cases: SwitchCase[];
+}
+
+export interface ThisExpression extends Node {
+ type: "ThisExpression";
+}
+
+export interface ThrowStatement extends Node {
+ type: "ThrowStatement";
+ argument: Expression;
+}
+
+export interface TryStatement extends Node {
+ type: "TryStatement";
+ block: BlockStatement;
+ handler: CatchClause;
+ finalizer: BlockStatement;
+}
+
+export interface UnaryExpression extends Node {
+ type: "UnaryExpression";
+ operator: "-" | "+" | "!" | "~" | "typeof" | "void" | "delete";
+ prefix: boolean;
+ argument: Expression;
+}
+
+export interface UpdateExpression extends Node {
+ type: "UpdateExpression";
+ operator: "++" | "--";
+ prefix: boolean;
+ argument: Expression;
+}
+
+export interface VariableDeclaration extends Node {
+ type: "VariableDeclaration";
+ declarations: VariableDeclarator[];
+ kind: "var" | "let" | "const";
+}
+
+export interface VariableDeclarator extends Node {
+ type: "VariableDeclarator";
+ id: LVal;
+ init: Expression;
+}
+
+export interface WhileStatement extends Node {
+ type: "WhileStatement";
+ test: Expression;
+ body: Statement;
+}
+
+export interface WithStatement extends Node {
+ type: "WithStatement";
+ object: Expression;
+ body: BlockStatement | Statement;
+}
+
+export interface AssignmentPattern extends Node {
+ type: "AssignmentPattern";
+ left: Identifier;
+ right: Expression;
+}
+
+export interface ArrayPattern extends Node {
+ type: "ArrayPattern";
+ elements: Array;
+ typeAnnotation?: TypeAnnotation;
+}
+
+export interface ArrowFunctionExpression extends Node {
+ type: "ArrowFunctionExpression";
+ id: Identifier;
+ params: Array;
+ body: BlockStatement | Expression;
+ generator: boolean;
+ async: boolean;
+ expression: boolean;
+ returnType?: TypeAnnotation;
+ typeParameters?: TypeParameterDeclaration;
+}
+
+export interface ClassBody extends Node {
+ type: "ClassBody";
+ body: Array