You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/01/24 23:22:30 UTC

[commons-io] branch master updated: Improved performance of IOUtils.contentEquals(InputStream, InputStream).

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 5bed26f  Improved performance of IOUtils.contentEquals(InputStream, InputStream).
5bed26f is described below

commit 5bed26f67efa370f55065e98206a4358e47c7df1
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jan 24 18:22:25 2021 -0500

    Improved performance of IOUtils.contentEquals(InputStream, InputStream).
    
    This is based on the PR https://github.com/apache/commons-io/pull/118 by
    XenoAmess but only for this one method.
---
 src/changes/changes.xml                            |   3 +
 src/main/java/org/apache/commons/io/IOUtils.java   |  49 ++--
 .../org/apache/commons/io/IOUtilsTestCase.java     |   8 +
 .../IOUtilsContentEqualsInputStreamsBenchmark.java | 238 ++++++++++++++++++++
 .../org/apache/commons/io/abitmorethan16k.txt      | 248 +++++++++++++++++++++
 .../org/apache/commons/io/abitmorethan16kcopy.txt  | 248 +++++++++++++++++++++
 6 files changed, 781 insertions(+), 13 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0f839f9..022bb3f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -194,6 +194,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="update" due-to="Dependabot">
         Bump jimfs from 1.1 to 1.2 #183.
       </action>
+      <action dev="ggregory" type="update" due-to="XenoAmess, Gary Gregory">
+        Improved performance of IOUtils.contentEquals(InputStream, InputStream).
+      </action>
     </release>
     <!-- The release date is the date RC is cut -->
     <release version="2.8.0" date="2020-09-05" description="Java 8 required.">
diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java
index 2e737ef..2e68824 100644
--- a/src/main/java/org/apache/commons/io/IOUtils.java
+++ b/src/main/java/org/apache/commons/io/IOUtils.java
@@ -744,26 +744,49 @@ public class IOUtils {
      * @throws NullPointerException if either input is null
      * @throws IOException          if an I/O error occurs
      */
-    @SuppressWarnings("resource")
-    public static boolean contentEquals(final InputStream input1, final InputStream input2)
-            throws IOException {
+    public static boolean contentEquals(final InputStream input1, final InputStream input2) throws IOException {
+        // Before making any changes, please test with
+        // org.apache.commons.io.jmh.IOUtilsContentEqualsInputStreamsBenchmark
         if (input1 == input2) {
             return true;
         }
-        if (input1 == null ^ input2 == null) {
+        if (input1 == null || input2 == null) {
             return false;
         }
-        final BufferedInputStream bufferedInput1 = buffer(input1);
-        final BufferedInputStream bufferedInput2 = buffer(input2);
-        int ch = bufferedInput1.read();
-        while (EOF != ch) {
-            final int ch2 = bufferedInput2.read();
-            if (ch != ch2) {
-                return false;
+
+        final byte[] array1 = new byte[DEFAULT_BUFFER_SIZE];
+        final byte[] array2 = new byte[DEFAULT_BUFFER_SIZE];
+        int pos1;
+        int pos2;
+        int count1;
+        int count2;
+        while (true) {
+            pos1 = 0;
+            pos2 = 0;
+            for (int index = 0; index < DEFAULT_BUFFER_SIZE; index++) {
+                if (pos1 == index) {
+                    do {
+                        count1 = input1.read(array1, pos1, DEFAULT_BUFFER_SIZE - pos1);
+                    } while (count1 == 0);
+                    if (count1 == EOF) {
+                        return pos2 == index && input2.read() == EOF;
+                    }
+                    pos1 += count1;
+                }
+                if (pos2 == index) {
+                    do {
+                        count2 = input2.read(array2, pos2, DEFAULT_BUFFER_SIZE - pos2);
+                    } while (count2 == 0);
+                    if (count2 == EOF) {
+                        return pos1 == index && input1.read() == EOF;
+                    }
+                    pos2 += count2;
+                }
+                if (array1[index] != array2[index]) {
+                    return false;
+                }
             }
-            ch = bufferedInput1.read();
         }
-        return bufferedInput2.read() == EOF;
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/io/IOUtilsTestCase.java b/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
index b662d26..9b4d41e 100644
--- a/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
@@ -548,6 +548,14 @@ public class IOUtilsTestCase {
             new ByteArrayInputStream(bytes2XDefaultA2)));
         assertTrue(IOUtils.contentEquals(new ByteArrayInputStream(bytes2XDefaultA),
             new ByteArrayInputStream(bytes2XDefaultA)));
+        // FileInputStream a bit more than 16 k.
+        try (
+            final FileInputStream input1 = new FileInputStream(
+                "src/test/resources/org/apache/commons/io/abitmorethan16k.txt");
+            final FileInputStream input2 = new FileInputStream(
+                "src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt")) {
+            assertTrue(IOUtils.contentEquals(input1, input1));
+        }
     }
 
     @Test
diff --git a/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java b/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java
new file mode 100644
index 0000000..b33bd81
--- /dev/null
+++ b/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.io.jmh;
+
+import static org.apache.commons.io.IOUtils.DEFAULT_BUFFER_SIZE;
+import static org.apache.commons.io.IOUtils.EOF;
+import static org.apache.commons.io.IOUtils.buffer;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+/**
+ * Test different implementations of {@link IOUtils#contentEquals(InputStream, InputStream)}.
+ * 
+ * <pre>
+ * Benchmark                                                          Mode  Cnt            Score            Error  Units
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFileCurrent          avgt    5      1518342.821 ▒     201890.705  ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFilePr118            avgt    5      1578606.938 ▒      66980.718  ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFileRelease_2_8_0    avgt    5      2439163.068 ▒     265765.294  ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringCurrent        avgt    5  10389834700.000 ▒  330301175.219  ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringPr118          avgt    5  10890915400.000 ▒ 3251289634.067  ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringRelease_2_8_0  avgt    5  12522802960.000 ▒  111147669.527  ns/op
+ * </pre>
+ */
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+@Warmup(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 1, jvmArgs = {"-server"})
+public class IOUtilsContentEqualsInputStreamsBenchmark {
+
+    private static final String TEST_PATH_A = "/org/apache/commons/io/testfileBOM.xml";
+    private static final String TEST_PATH_16K_A = "/org/apache/commons/io/abitmorethan16k.txt";
+    private static final String TEST_PATH_16K_A_COPY = "/org/apache/commons/io/abitmorethan16kcopy.txt";
+    private static final String TEST_PATH_B = "/org/apache/commons/io/testfileNoBOM.xml";
+    private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
+    static String[] STRINGS = new String[5];
+
+    static {
+        STRINGS[0] = StringUtils.repeat("ab", 1 << 24);
+        STRINGS[1] = STRINGS[0] + 'c';
+        STRINGS[2] = STRINGS[0] + 'd';
+        STRINGS[3] = StringUtils.repeat("ab\rab\n", 1 << 24);
+        STRINGS[4] = StringUtils.repeat("ab\r\nab\r", 1 << 24);
+    }
+
+    static String SPECIAL_CASE_STRING_0 = StringUtils.repeat(StringUtils.repeat("ab", 1 << 24) + '\n', 2);
+    static String SPECIAL_CASE_STRING_1 = StringUtils.repeat(StringUtils.repeat("cd", 1 << 24) + '\n', 2);
+
+    @SuppressWarnings("resource")
+    public static boolean contentEquals_release_2_8_0(final InputStream input1, final InputStream input2)
+        throws IOException {
+        if (input1 == input2) {
+            return true;
+        }
+        if (input1 == null ^ input2 == null) {
+            return false;
+        }
+        final BufferedInputStream bufferedInput1 = buffer(input1);
+        final BufferedInputStream bufferedInput2 = buffer(input2);
+        int ch = bufferedInput1.read();
+        while (EOF != ch) {
+            final int ch2 = bufferedInput2.read();
+            if (ch != ch2) {
+                return false;
+            }
+            ch = bufferedInput1.read();
+        }
+        return bufferedInput2.read() == EOF;
+
+    }
+
+    public static boolean contentEqualsPr118(final InputStream input1, final InputStream input2) throws IOException {
+        if (input1 == input2) {
+            return true;
+        }
+        if (input1 == null || input2 == null) {
+            return false;
+        }
+
+        final byte[] array1 = new byte[DEFAULT_BUFFER_SIZE];
+        final byte[] array2 = new byte[DEFAULT_BUFFER_SIZE];
+        int pos1;
+        int pos2;
+        int count1;
+        int count2;
+        while (true) {
+            pos1 = 0;
+            pos2 = 0;
+            for (int index = 0; index < DEFAULT_BUFFER_SIZE; index++) {
+                if (pos1 == index) {
+                    do {
+                        count1 = input1.read(array1, pos1, DEFAULT_BUFFER_SIZE - pos1);
+                    } while (count1 == 0);
+                    if (count1 == EOF) {
+                        return pos2 == index && input2.read() == EOF;
+                    }
+                    pos1 += count1;
+                }
+                if (pos2 == index) {
+                    do {
+                        count2 = input2.read(array2, pos2, DEFAULT_BUFFER_SIZE - pos2);
+                    } while (count2 == 0);
+                    if (count2 == EOF) {
+                        return pos1 == index && input1.read() == EOF;
+                    }
+                    pos2 += count2;
+                }
+                if (array1[index] != array2[index]) {
+                    return false;
+                }
+            }
+        }
+    }
+
+    @Benchmark
+    public boolean[] testFileCurrent() throws IOException {
+        final boolean[] res = new boolean[3];
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+            res[0] = IOUtils.contentEquals(inputStream1, inputStream1);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+            res[1] = IOUtils.contentEquals(inputStream1, inputStream2);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+            res[2] = IOUtils.contentEquals(inputStream1, inputStream2);
+        }
+        return res;
+    }
+
+    @Benchmark
+    public boolean[] testFilePr118() throws IOException {
+        final boolean[] res = new boolean[3];
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+            res[0] = contentEqualsPr118(inputStream1, inputStream1);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+            res[1] = contentEqualsPr118(inputStream1, inputStream2);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+            res[2] = contentEqualsPr118(inputStream1, inputStream2);
+        }
+        return res;
+    }
+
+    @Benchmark
+    public boolean[] testFileRelease_2_8_0() throws IOException {
+        final boolean[] res = new boolean[3];
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+            res[0] = contentEquals_release_2_8_0(inputStream1, inputStream1);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+            res[1] = contentEquals_release_2_8_0(inputStream1, inputStream2);
+        }
+        try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+            InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+            res[2] = contentEquals_release_2_8_0(inputStream1, inputStream2);
+        }
+        return res;
+    }
+
+    @Benchmark
+    public void testStringCurrent(final Blackhole blackhole) throws IOException {
+        for (int i = 0; i < 5; i++) {
+            for (int j = 0; j < 5; j++) {
+                try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+                    InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+                    blackhole.consume(IOUtils.contentEquals(inputReader1, inputReader2));
+                }
+            }
+        }
+    }
+
+    @Benchmark
+    public void testStringPr118(final Blackhole blackhole) throws IOException {
+        for (int i = 0; i < 5; i++) {
+            for (int j = 0; j < 5; j++) {
+                try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+                    InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+                    blackhole.consume(contentEqualsPr118(inputReader1, inputReader2));
+                }
+            }
+        }
+    }
+
+    @Benchmark
+    public void testStringRelease_2_8_0(final Blackhole blackhole) throws IOException {
+        for (int i = 0; i < 5; i++) {
+            for (int j = 0; j < 5; j++) {
+                try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+                    InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+                    blackhole.consume(contentEquals_release_2_8_0(inputReader1, inputReader2));
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/test/resources/org/apache/commons/io/abitmorethan16k.txt b/src/test/resources/org/apache/commons/io/abitmorethan16k.txt
new file mode 100644
index 0000000..57f6249
--- /dev/null
+++ b/src/test/resources/org/apache/commons/io/abitmorethan16k.txt
@@ -0,0 +1,248 @@
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##  http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+
+a bit more than 16 K
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
diff --git a/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt b/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt
new file mode 100644
index 0000000..57f6249
--- /dev/null
+++ b/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt
@@ -0,0 +1,248 @@
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##  http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+
+a bit more than 16 K
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679 
+012345679 012345679 012345679 012345679 012345679 012345679 012345679