OSDN Git Service

Improved Java self-test method.
authorLoRd_MuldeR <mulder2@gmx.de>
Sun, 2 Jul 2017 12:47:06 +0000 (14:47 +0200)
committerLoRd_MuldeR <mulder2@gmx.de>
Sun, 2 Jul 2017 12:47:06 +0000 (14:47 +0200)
bindings/Java/example/src/com/muldersoft/mhash384/example/ExampleApp.java
bindings/Java/library/src/com/muldersoft/mhash384/MHash384.java
bindings/Java/library/src/com/muldersoft/mhash384/package-info.java [new file with mode: 0644]
bindings/Microsoft.NET/library/src/MHash384.cs

index 7e4fdb5..f0f28ff 100644 (file)
@@ -26,8 +26,11 @@ import java.awt.Container;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
 import java.awt.Insets;
+import java.awt.KeyEventDispatcher;
+import java.awt.KeyboardFocusManager;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
 import java.awt.event.WindowEvent;
 import java.awt.event.WindowListener;
 import java.io.BufferedInputStream;
@@ -64,18 +67,11 @@ public class ExampleApp extends JFrame {
                                try {
                                        final List<Integer> version = MHash384.getVersion();
                                        setTitle(String.format("MHashJava384 - Example App v%d.%d.%d", version.get(0), version.get(1), version.get(2)));
-                                       MHash384.selfTest();
-                               }
-                               catch (UnsatisfiedLinkError err) {
-                                       err.printStackTrace();
-                                       JOptionPane.showMessageDialog(ExampleApp.this, "Failed to load MHash384 library!\n\nDETAILS:\n" + err.getMessage(), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
-                                       dispose();
                                }
                                catch (Throwable err) {
                                        err.printStackTrace();
                                        while(err != null) {
-                                               final String message = err.getMessage();
-                                               JOptionPane.showMessageDialog(ExampleApp.this, ((message != null) && (!message.isEmpty())) ? message : err.getClass().getName(), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
+                                               JOptionPane.showMessageDialog(ExampleApp.this, getMessage(err), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
                                                err = err.getCause();
                                        }
                                        dispose();
@@ -149,8 +145,19 @@ public class ExampleApp extends JFrame {
                content.setLayout(new BorderLayout());
                content.add(body, BorderLayout.NORTH);
                content.add(buttonBar, BorderLayout.SOUTH);
+               
+               KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
+                       @Override
+                       public boolean dispatchKeyEvent(final KeyEvent e) {
+                               if((e.getKeyCode() == KeyEvent.VK_F12) && (e.getID() == KeyEvent.KEY_PRESSED)) {
+                                       runSelfTest(new JButton[] { buttonBrowse, buttonExecute });
+                                       return true;
+                               }
+                               return false;
+                       }
+               });
        }
-
+       
        private boolean browseForFile(final JTextField editFile, final JTextField editHash, final JProgressBar progressBar) {
                final JFileChooser chooser = new JFileChooser();
                boolean result = false;
@@ -163,7 +170,7 @@ public class ExampleApp extends JFrame {
                        }
                        catch (Throwable err) {
                                err.printStackTrace();
-                               JOptionPane.showMessageDialog(ExampleApp.this, err.getMessage(), err.getClass().getName(), JOptionPane.WARNING_MESSAGE);
+                               JOptionPane.showMessageDialog(ExampleApp.this, getMessage(err), err.getClass().getName(), JOptionPane.WARNING_MESSAGE);
                        }
                }
                return result;
@@ -185,7 +192,7 @@ public class ExampleApp extends JFrame {
                }
                catch (Throwable err) {
                        err.printStackTrace();
-                       JOptionPane.showMessageDialog(ExampleApp.this, err.getMessage(), err.getClass().getName(), JOptionPane.WARNING_MESSAGE);
+                       JOptionPane.showMessageDialog(ExampleApp.this, getMessage(err), err.getClass().getName(), JOptionPane.WARNING_MESSAGE);
                }
        }
 
@@ -216,6 +223,42 @@ public class ExampleApp extends JFrame {
                };
        }
        
+       private void runSelfTest(final JButton[] buttons) {
+               System.out.println("[SELF-TEST]");
+               for(final JButton button : buttons) {
+                       button.setEnabled(false);
+               }
+               final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
+                       @Override
+                       protected Boolean doInBackground() throws Exception {
+                               MHash384.selfTest();
+                               return true;
+                       }
+                       
+                       @Override
+                       protected void done() {
+                               try { 
+                                       if(get()) { /*check result*/
+                                               JOptionPane.showMessageDialog(ExampleApp.this, "Self-test completed successfully.", "Self-test", JOptionPane.INFORMATION_MESSAGE);
+                                       }
+                               }
+                               catch (Throwable err) {
+                                       err.printStackTrace();
+                                       while(err != null) {
+                                               JOptionPane.showMessageDialog(ExampleApp.this, getMessage(err), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
+                                               err = err.getCause();
+                                       }
+                               }
+                               finally {
+                                       for(final JButton button : buttons) {
+                                               button.setEnabled(true);
+                                       }
+                               }
+                       }
+               };
+               worker.execute();
+       }
+       
        private static class HashWorker extends SwingWorker<String, Integer> {
                private final File inputFile;
                private final Component parent;
@@ -252,8 +295,7 @@ public class ExampleApp extends JFrame {
                        }
                        catch(Throwable err) {
                                while(err != null) {
-                                       final String message = err.getMessage();
-                                       JOptionPane.showMessageDialog(parent, ((message != null) && (!message.isEmpty())) ? message : err.getClass().getName(), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
+                                       JOptionPane.showMessageDialog(parent, getMessage(err), err.getClass().getName(), JOptionPane.ERROR_MESSAGE);
                                        err = err.getCause();
                                }
                                return null;
@@ -268,4 +310,9 @@ public class ExampleApp extends JFrame {
                }
                return result;
        }
+       
+       private static String getMessage(Throwable err) {
+               final String message = err.getMessage();
+               return ((message != null) && (!message.isEmpty())) ? message : err.getClass().getName();
+       }
 }
index 709fc99..40071b0 100644 (file)
@@ -93,6 +93,17 @@ public final class MHash384 {
                }
        }
        
+       private static class TestVector {
+               
+               public final int iterations;
+               public final ByteString message;
+               
+               public TestVector(final int iterations, final String message) {
+                       this.iterations = iterations;
+                       this.message = new ByteString(message);
+               }
+       }
+       
        //=========================================================================================
        // CONST DATA
        //=========================================================================================
@@ -1463,17 +1474,18 @@ public final class MHash384 {
        //=========================================================================================
        
        public final static void selfTest() {
-               final List<ByteString> TEST_VECTOR = buildTable(
-                       /*000*/ "",
-                       /*001*/ "abc",
-                       /*002*/ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-                       /*003*/ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-                       /*004*/ "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern",
-                       /*005*/ "Frank jagt im komplett verwahrlosten Taxi quer durch Bayern",
-                       /*006*/ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.\nAt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.\nConsetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo.",
-                       /*007*/ "\u0092\u00AD\u00ACI\u007F\u00FA\u00B3\u000B@\u00ACgO\u009DS\u00A9\u00A6$\u00B2G\u00FA#r\u0094\u00FAu\u0088A\u00A8_M\u00DE\u00FD\u00DB\u00FD#q\u00C1\u00E2\u00CA\u00F8[\u000E\u0006K\u00BCO:\u00C0\u00A9\u00C6\u00FDl\u0018]\u00C4\u00B1,\u008A\u00AC\u00C3\u00E6%\u00BD\u00E8z\u00DF\u00CB\u00FF`\u001B\u00F0f\u00DF\u0008|\nc\u00CE,\u0011\u00D6d\u008D\u001E\u00D0W\u00CE\u001B]\u0093\u00C6\u00CBo3\u0019\u0081\u00B9\u00FC\u00B5\u00BC\u00F4\u00FBowPT\u0006\u00D7\u001A\u0087\u00EC~\u00C1\u0099U\u0097\u00FB\u00B7\u0096\u009D\u00EC\r\u00AD\u0001\u0093\u009E\u0088\u0089\u00F50\u0096?\u00E9.#\u00A8\u00F5\u00DA\u00E5G>,\u001E\"8*\u00D4\u00F7\u000E\u00A2\u00E4^\u00BB\u00CB\u00AD\u0011\u00C8zt\u008Fx\u00CBVw\u008E\u00F4\u001C\n\u00EC\u00A5c.u\u00E3R\u00B2\u00EA\u00B5S<\u0006\u00F7\u00C6\u0080\u008Ew\u00D0\u000B-\u00B5\u00F9d\u00F5\u009F\u0089\u0083\u00D9%y\"&\u00E2\u00F3\u00E6\u00D4\u00B0\u00FD\u00E7\u00BAtlY\u00BA\u009A\u0020!,%\u00DA\u0002\u00D2:\u00EE_\u0088Zu\u00F1\u001A\u00C5\u00BD\u00D5\u00CCo\u009CKr\u00BCG\u00D8@\u0089r\u0000\u00F1\u00B7\u00EF\u0097\u007F#R,\u00838\u00A3\u00FC\u00FD\u00D7r\u00C6\u0015\u00D3J\u0093F\u00BC\u00B1\u00CE7\u0014\u00FC\u000E+\u00CB\u0099\u00C74M\u00AC\u00D8H\u00A1\u00EEXCm\u00B4x\u00D00\u00E4\u0009\u00F1{:\u00E9`h\u00D9\u0006\u00F8Y\"jfG\u00D6\u0009\u008A\u0095\u0018;\u0001F\r)6{\u00A5\"\u00B4\u0005~0\u00AC\u008B\u00C2\u00D5L\u00BBcP\u000Bv\u00A16\u00EB6\u00A0w\u00D8\u00F7\u0098\u0014W\u0091\u000E\u008D\u009CB\u0095\u00E99B\u0001\u00C9\u00B8\u00DF\u0082\u0087\u00FF\u00E5\u00E6f\u0080\u000B\u0019\u00B4\u0013\u00AC\u00ECq*]5\u00C5\u00CA\u000FV\u00E6\u00A3QpX!\u00B2\u0020\u008D\u00C9\u00DE\u00CC%\u0019\u00D5\u00CF\u00A1\u00B9+h\u00BE\u00D2d2\u0094\u009B\u0002|\u00F2\u0000\u00FE=\u008B@\u00A2\u0019P\u000F\u00EEAa#\u00A8\u00C5\u00A3\u00F5\u00FC75\u001EjQB\u00AA3\u008D4\u0011\u00F8\u00B3\u00BD+t\u0099\u0016\u00FF\u00AD&\u008F\u0000\u00C5\u00F5\u001CY\"\u0002>\u00B1q\u0008C\u00BF\u00A7k\u00CD\u00033\u000ES\u009D\u00BA\u00E5(\u00CA\u0009\u00E6\u001B\u00AE\u0011v\u00A9z\u0089\u00DFH\u00DC\u0085\u00F1\u009A\u00ED\u009F\u00E1\u009F-\u00B7\u00DA!\u00BA\u00D1\u000C\u00CAg\u0005[\u00CC$[\u00EA\u00F0\u00B8l\u00C4\u00B8",
-                       /*008*/ "\u0005\u0085{\u00AA\u00C0\u00C9\u00E8b`b\u00B0\u00A0\"\u0003\u0088\u00A6\u0084C\u00AA\u008Cw\u000C\u0082\u0094]5\u0082\u0098\u0004\u001C\u00DD\u00A8\u00D4N\u0090om\u00B9\u0081\u00E2{?\u0095t$>\u009FS{\u00EF\n%Gy\u0089\\\u00B6\u00B27\u00FCOto\u007F\u00CD\u00E3s\u008B\u00F5\u00D1\u00A2<\u00BCp\u00F1A\u0084\u00F2\u00EB7\u009B\u00CB\u00C3\u00D7F.R\u00C3\u0097:\u00B6t\u00F3\u00D5\u00BBZ\u00896\u00F3\u001D\u00D5\u00A1\u000E\u00F1\u008E\u00F4\u0017&\u00CEf\u0000(\u00DE\u0017=[;\u0083{\u00D3\u00AB\u00C4\u00A1\u00EF\u008AY\u00A2\u00E2\u00BAn\u0013\u00EE\u00EA\u0083k\u00C1\u00B1\u0017\u009Ce\u001A\u00BEE\u00A7\u00B2@\u0091\u0099\u0007\u009FK_\u00BE\u00F8\u00C6~N\n\u00FF[\u00B5Z|/\u009Ew\u00EE;\u00E0\u00B5b\u0080\"\u009D-\u0013\u00CB\u00BC3\u0080\u00DD\u00AB\u0015\u00AA\u00AD\u0004:\u00AD\u008C\u00D52M02\u00F0qG'^K\u0012\u00FB\u00EF{\u00AB\u0083\u00AC\u009D\u00CD\u00ED\u00EE,%i\u0019m`\u00EF\u0018\u00B5\u00A0\u0080\u009D\u00A2\u00831\u0087\u0007SR\u00E1[L\u001E\u00FFAa4\u001C>\u001F_\u00A2X\u00D7gV#\u00B6\u00EC\u00F5\u00BC'\u00CE\u00CD\u00B4\u00B2W\u00B1;\u00EB\u00A6X\u0095\u00E0\u00B5\u00E8\u00B1\u009E\u0018?K`\u0096N\u00FBY%\u0006\u00F4\u0095\u0083\u0080\u0098]\u009FY\u009B\u0083&\u0097\u0089\u00CE\u00AC\u00BB\u00D0\\\u00957\u00DC\u00E4\u00DD/\\\"\u009Ce\u0010\u00FBa\u00A1s\u00A1j\u0089a\u0093|\u00C8n\u0080\u00B8HWHO\u0088~j\u00CE\u0090\u00F3\u00EB\u00B3\u009FP\u00F0\u000F\u00B6)`(\u00E5\u008B\u00DF\u00EA\u00CA\u00FB<\u00DD\u00AA``s\u00B3\u00AEEO\u00C9\u001D\u00B2c10;\u0085\u00BA\u008A7A\u00D6ZR\u0011\u00A2*\u00119\u00D2\u001E-\u00BF\u001AS\u008A\u0013$\u00C7\u00A3\u00DE\u00BE\u000B#r\u00CC\u0092)\u00B8+\u0092\u008F\u0008\n\u00B4\u00A6Gv)9\u00BF@\u00BCY\u009F\u00CD\u009D\u00CF5Q\u0016\u00F5D@\u00A4\u00C3\u001D\u00A8\u008Cs\u00C0\u00A1\u0012\u0084\u0015M\u00B1{JD\u00F4\u0012\u008E\u000F\u00E4L~\\\u00B2\u0092_\u00A9\u00B3q\u00DA@Px\u00C7\u0002\u001F\u0020y\u0084\u00F3\u0091\u001FGG@g+R\u00A1g\u0091\u0005\u00CA\u00B4\u00AB\u00A8i@\u00FD\u007F(\u00F6\u0017\u00B0\u00DD\u001A\u0082\u000F\u0020]\u00D29\u00A8\u009As\u00F1\u00AC\u0010\u0018<i\u0099I\u00B8\u00B2\u0090$\u00B5.\u000CW\u0093j\u001B\u000B\u009C\u00B9\u00F5Eq\u00DD\u00AF\u0094o\u00A5\u00F5\u00CF\u00B1\u00BC\u001C\u000E^Z\u000E\u00F6\u009D\u009Eq\u0011\u0099\u009F\u00A4W\u00E6m\u00D5\u0083\u0000\u00D7\u0085\u000CT\u0001\u00D4I\u001C\u00F6\u008C\u008E\u0000\u008B\u00F8HPMo\u00F1\u00EA\u00EF-d\u00D4\u00F5\u0000\u00A9\u0003\u00E6\u00CB_\u00CFl\u00D6&\u00C1\u00F4\u0097\u00CF\u00B5\u0016\u00A1b\u00DE\u00FF\u00C2\u0000\u00D0\u009A^\u00BB\u00B4v\u0086\u00FDK\u00F2)O\u000Fi\u0015}\u00AC\u00AA+\u00D1\u00BAn\u00A2\u001A\u00C1k\u009A\u0014\u0090c\u00BD\u00C416\u00BB&\u00A7i}\u0011v\u00E5?\u0005\u00C5Om\u00B0\u0012.\u00BCr\u0018\u008A\u000F\u0007\u00A1*\u00D0\u00C0\u00DE+c\u0019n\u00A8\u007F\u00C7\u009DG/\u00A6b\u00A3W\u00F07X\u009F\u0080M\u009D\u00A9/*9y\u0016j\u00CA\u00DF\"\u008F/\u00AA\u00A2ru\u0096c\u0019\u00E2\u00DF~7\u001Dh\u00F8\u00D9]\u008D@#\u007F\u00F5\u001B@3\u00CB8\u0081OJ^%<\u00F0\u0019\u00D7\u0001\u00D1!\u00F6\u00C5o\u00DA\u0017\u0083`9%f\u00F2%1X\u00A6\u00A4\u00ADFx\u00E7vW\u0019\u00CB|\u009Cm\u00E0m\u00F8\u00FD(\u0014\u0014\r\u00F0\u000C\u008F\u00D4hY\u00D2\u0096\u0015\u00BF\u00EC\u008A4\u00F7\u001A;,\u008CJ\u0098\u00167}\u0095\u0015\u00BDE\u00CB\u00F8\u00C1\u00A1\u009Ed:\u0017L\u00C4\u00D2\u00D1\u00A0\u00A4\u00BDZy\u00CBS\u00BC7\u0084\u00C8O\u009B\u00D7\u0010B=&@\u00D6\u00F2P\u0020\u0017\u008C*\u0081:\u00B5\u00D2\u008Bf\u00E5\u009F\u00CB\u00EB)\u00C8A\u00D1\u00B1\u009F\u00BAw*\u0018\u00D7\u007F\u008DF`\u00FE\u00DB\u00E4\u00C1\u00A5s\u00DD\u0088{\u0017\u00AA=X0\u009B\u00F6\u00B2fN\u00AC\u00C3\u00E3\u00A4z\u00AE\u00DF3\u00BER\u0089\u00B7\u00F9\u00B0\u0018\u00FBpc\u009A\u00C2\u00B5\u00FD\u00EF<\u008E\u0091i_\u00A8\u00E0\u00F6\u0083%\u00EF\u0016\u00AA\u00AF'\u00B5\u00D5,XW5g]\u00111\u00A3%9\r\\\u00F1\u00AC\u00D4\u00FB\u0003L\u008A\u00C0\u00FB\u00B2\u00E5\u000E\u00AD\u007F\u00C9\u00B13\u00AE\u00D9\u00EE=q\u00CB#T\u00F9\u007F\u00BF\u0002M\u00E1\u00D2\u00BCf\u00A9\\\u009D6GZbv\u00EF\u00C5\u00C80\u00BCxy\u0092b\u00A8\u00E9\u000B\u0083\u00E5\u0091B\u008F\u00FC\u00E9\u00A8l\u00AB\u00A9u\u00A1\u009Bk\u00A2\u00E5\u0087\u0096\u00BE\u0016\u0084\n\u0004)\u009F.-\u00C9\u00C8\u00DA\u00EA\u00F6\u009A%\u000F\u00F8\u00C0\u00FD\u00B5\u00D7\u0082",
-                       /*009*/ "\u00FF\u00D3\u00B0\u00A7-oh:\u000B\u0080u\u00AA\u00E0\u00E7\u001Ew2\u0081}te\u00EE\u0085\u00B5z\u00D8\u00D6S\u00CE\u009FO\u00B7\u00BD\u00D4\u00B0\u00B6{D\u00A5,.i\u00C9`\u00E3\u00AE\u00C7\u00ADf\u0004\u00DC\u001D\u00B1\u00AE\u00B2\u00AE^\u00F0x\u00CB\u0008\u00FF@\u001C64\u000C\u0010\u00E3A\u009B\u0080\u008Fb\u00BF\u00D6%\u00B7-t\u0083O$~\u00BA\u00B7\r\u0087\u009A\\r\u00E6\u00F0\u0009yQ+\u001F\u00E6J\u00C0\"\u0017Xf\u00E9\u008B\u00B2\u0092\u00E3b\u00FCsn\u00BCr\u00D5\u00CF\u0008\u0005K\u00B6\u0014<\u00913>`\u00BA\u0081\u00C3\u00FD2\u00A9\u00B7d\u00D8\u001F\u009BDc-\u001Ap\u00E1\u00F5N\u00A0\u008D<\u0020\u008CFY\u00F5\u00F4\u00E2\u00E6\u00A2\u00A7\u00E8\u0018\u00CBM\u00DBZ\u00C6\u0090\u0093\u00AC\u00DFj\u00FF\u00D1\u0000\u0096O\u00FC\u00EF\u00B7j\u00EB\u00BB\u00870O\u00FC\u0019\u00CE\u00123\u00C1\u0013\u00DE\u00DF\u00A3{\u0089\u00C2\u00A3\u00DC\u00A4\u00A9\u00BD\u0004\u0010\u0096\u00EE\u00B8w\u00FA\u0098\\B\u0001\u00F3\u00F5\u00D4\u00EF\u0018\u000E\u00B4\u000F.,\u00FC\u009A\u00D0\u00CFL\u0099\u00E1\u0020\u00F0e[\u00FE\u00AF\u00F0\u009B\u00B5\u00DF\u00D5+\u00C2=\u00B0\u00FD\u00E81<\u007F\u00A6eo\u00BA\u000E\u00D9\u00C9\u008D[\u00D1\u00EA|\u007FKR\u00ED\u0080O&\u0017\u0095\u0091k\u00B8\u0008,\u001EbO\u00D2\u00D0z\u0000u\u00A6\u0013)\u0093\u00CB\u00C4\u00C5\u00A7\u009E\u0090\u00B1|\u008C\u001CzYl\u001D]\u00FCF\u00AF\u000C\u0096\u00BA1\u0095D{\u00CB^\u00ABdB\u00F75z\u001F\u0087\u00F2\u00B3>B3(\u00CFRGG\u0013\u009A\u00A3c\u00D1\u00BDz\u00F0\u000C\u0090h\u001D\u000C\u0003\u0083\u00A9\u008E\u009Dz\\j\u001Ef\u00A9\u00F1+\u00B8\u00CE\u00A2\u00D2+\u0017!\u00B1\u0083\u0087\u00FC\u00F1\u00F3Fx\u00DC\u00D3\u0096f\u00C2\u00B4\u00D3\u0083\u0002\u00A8\u00D7\u00A5\u0095\u00DF0\u0004\u00F2\u00D1R\u008CZDbh\u00BC\u00CD\u00A7i\u00CBN\u00B4[\u0010\u0083Y\u00AC()\u0013\u0004\u00C3\u00B2z\u00C55\u00A7\u00B0\n\u00D4\u00F0\u00F0\u00EC\u00B4\u00C0\u00F2\u00D2\u00C2+\u0088\u0003\u00D5\u00E6No\u00EF\u00AD}\u00D8\u000F\u00F0l\u00B0\u00B1\u0009\u00D8\u009D\u0099\u0014\u00E3\u0000\u0005#\u00C7\u0015\u00B9\u00B1\u00B7\u00F1\u00EE\u009F\u00CE\u00049\u00B7\u00E2M\u000CZ\u0013zr\u0008!\u0011(\u00B25\u00ECz\u00E5#\u00D5f\u00D6Lz\u0082\u00FDn\u001F:\u0001\u00DC8:!{#\u00B5\u00FA\u00CC\u0005e\u008D\u00DC\u00DA\\\u00A7\n\u001A\u00A0\u0002\u00F4\u00B6\u00A024w\u00C5\u00E2\u00BB\u0010F\u00CEW\u00E3\u00A9\u000Bes\u008F\u00D5\u00A5\u0017\u0083\u0000\u00BD@\u00B1\u00EED\u00F4\u00EB([\u0096\u00A6\u00C1\u0094\u00D3\u00B6K\u00AE\u00F4r\u00F6\u00EC\u00AC\u00D4R\u009E\u00C7z\u00A8K=\u001D\u00BC\u00C0W{\u0091b\u00EEMg\u00F3\u00BA\u008D\u00BBm\u00E7H^\u00BE\u0016H\u0085lRH\u0000\u00FF\u0006\u0095\u00E1~\u00D9\u0013\u0098\u00E0m\u0096\u0013\u00B7K(;\u00AC\u00C5\n7\u0085\u00BBn\u00E5\u00E9/,\u000E\u009E\u00B7D\u00E7\u0085\u00F2[\u00FD\u00EE\u008B\u00C2\u00B80\u00E0\u0081)\u0094\u00DB3\u00FF\u00882\u0091\u00F9\u00CB\u0014\u00BC-\u0091&\u0013J\u00A2\u00E2\u00D7\u00D0\u00CA\u009F\u001F6z\u0012}\u000C\u009A\u000B\u00E6\\\u00E2\u00B7M\u00E5\u000B\u00A4>%\u00F8\u00D9\u008D\u009D\u00F4\u00E3,\u008A\u009B\u0098\u00ADk\u00F5\u000F\u00FB}\u00DA*\u00FE!\u0018v\u009A\u001AU\u00FC%\u00CA>\u00F9\u00FD\u00E4\u00B6-\u0010>Xy\u00D80\u00ED\u00DDK\u00B6\u000F\u00D5\u00D6\u00F6\u00B4\u00B17|N)\u00E6\u00F7y#t\u0001f_\u0002\u00EB\u00F2\u009FQ\u000291\u00AA\u008B\u00BC\u00DEnZm\u00AF:\u0084#4\u00F4\u0013\u009C\u0004\u00FD~l\u00E7\"\u00CC\u00B92k\u00D9\u00C2w\u00C2{\u00DF\u00E9\u00B6\u0017S\u00AF{\u00A6\u0094\u00AE99\u0000\u00EFu\u00E2M\u0015\u00F6E\u001A\u00B2\u009F\u00D6\u0082$E\u00B2\u0007\u00A7\u0000=\u0014\u0001b@\u00DD\u00D2\u00B8\u00F0\u0096\u009B\u0007\u000CI\u00F8t\u00B2\u00BF\u00E91\u00B3.\u009D/0\u00C2\u00F6\u00EDLVB\u00D4GUj\u00F49\u00C2#_X\u00BD,{\u00C5J\u00DC\u008A\u00AD@\u00E5\u0084\u00A0e\u00B3est\u009F\u00AB\u00BD\u00E6\u0009\u00A2$e\u008D\u00F6[[\u0014K\u00C0jx\u00F2\u00D6\u00F3vE\u00A0w\u00DD\u00AA\u00DB\u0013\u00F9\u009F\u000FZ\u00A5\u00A0\u00B9(H\u0095$\u0003-\u0094n\u00E1\u0005\u00F7\\#\u0082)\u0095\u00A1|\u00F2\u00E3\u00B9/\u00AC)\u0011\u00EC`\u00D1L_\u00B8\u00D2\u001E\u009D\u00ECv\u001D\u00FC_\u00C0\u00FE\u00D1P3\nB\u00D7\u0083\u00C9\u00F9IT\u00BBP\u0017lk8\u00C11\u0019\u00DB\u00FC\u00DE\u00CE\u0017\u00AD\u00B2\u00D1\u00DA\n\u0013\u00EE+\u00ED:\u00EA\u00EA\u0020\u008E\u0017\u0014\u000B\u0088\u00EE\u00B9\u00A5\u0002\u001B\u00E8l\u00F7\u00FB\u00E4\u0018r\u00E75\u0088\u00DE\u008E\u00B8V\u00FB\u00D9\u008C\u00B8\u0081\u00A79\u00AC\u00F2\u00D29\u000B\u00AF\u007F\u00B6\u00D2\u000E\u00A5\u00C7\u00A0\u00B3\u00EFoK\u00F4\u0008x\u00B2\u00A8\u0089\u00CD\u000E\u000E\u008A\u00B1\u008F\u008C\u00AC\u00E3##\u00B6\u00D1l\u0080\u00FD\u00F5Me;u\u0017\u00FC\u0081\u00A3\u0088\u0015*\u00EE\u0019\u00E0\u00FD\u00F5\u00F1\u00C2\u00C3\u00DD\u00EEz\u0008\u0012%ruBw\u008DQ[\u00D61a\u0088!s\u0086.\u00E5\u008E\u000B>\u00BEa\u00B8\u00E4\u00FD\u00FAg\u00C6Dx\u00B21\u00D9\u008B\u00BF\u00A8\u0007\u008F~\u00BEFTS$\u009A%\u00E5\u00D3_\u00C0\"\u0020\u00EA\u00C0\u0086\u00CDl\u00F8zJl\u0018\u00BD\u000F\u00CC\u00F3_\u007F\u00E0\u00BE\u00B0S\u0094_\u00E0\u0089\u0011\u0086\u0092\u00F2?\u001A\u00BD\u00E8h\u00B85;\u0091\u008F\u0085s\u0098\u00B9~\u00D1\u00C0\u00AD\u00F8Mr\u0004O\u001D\u00AD\u0082_\u0086\u00DD\u0089\u0017s8\u00F8%4\u00BAW$\u00F8\u00F3\u00E3P\u00AEA\u00D9\u0091\u00F8\u00AC\u008E\u00C4\u0087\u00F6X\u00D2\u001C1\u009B\u00C9\u000E(V\u00C9_\u0009Cs\u00A0y\u0013X\u00F2^%\u0089\u008F\u0017X\u009E\u00B3^0l\u008A\u00AB\u0081C'lS\u0082\u0008\u0019\u00B9\u00C0\u00FB\u00DA\u00F4\u00DD\u00BDUf\u008Dq\u00FFg@NS\u00B3p\"{\u0080\u0020\u008C\u0092?\u000Fs\u00AB\u00F1\u00E4Z\u00A2W=\u00DF\u00DE9\u00D0\u00E5G\u001CA\u00DAz\u0095\u000C^\u00E4\u00A3\u00844n>\u00A4\u009A\u00FD\"F\u00A9yei\u0019j\u00CE\u008A\u00E9X\u0094J\u00E1\u00D9q\u0002\u00D9\u008FF\u00A6\\YH\u001Fc\u0097\u001F\u00AF\u00FC\u0011\u00F0\u0008\u0002\u0011\u0002\u00FFp\u00A4\u00E7:\u00B9\\\u00F1p\u00CAX\u00F3\u001A\u0000\u0014\u00FA|\u00BF~\u001B\u00DE~\u00D6OX@\u00FB\u008F\u00EA\u00DC\u008B\u00EC\u00E2*\u00DD9\u0097\u0004\u00BE=\u008E\u000C\u00AD\u009BH\u00EF\u0092_v\u00E3\u000C\r@\u0020\u0008JF\u00E7e8\u00F1\u00B4C\u00E6\u0099\u0006]\u00D5M{\u00DF\u00D6Fz\u0092UV\u0008\u00E4_\u0008\u00D8\u00C5\u0094\u00A6^\u00FE;\u00EC\u00A3\u00E8T\u0090+\u00F7\u00F37%\u0090&\n\u001Cx\u00E6\u00E5\u008D\u00FFS\u0096K\u00BB\u00E4\u00DEF\u0005h|\u00BF\u0005\u0019\u00D4\u00D2\u00C6\u008E\u00AE\u00E9E1`\u00F8L\u00D1\u009A\u00F1\u00CAnna3\u00D0W\u0015\u000E\u0015j\u0014\u0006\u001D\u00CEe\u00CAEq\u00A7\u00BBz\u00DE\u00CE\u00F6\u00EAb\u00A6\u00FAT\u00C1\u00AE\u00B4w&\u0007\u00C0\u00100\u00B1\u00CC$\u00BF\u00E8E\u00C2\u00A9\u00D3Kf\u00A1\u00E3\u00F0W\u00B0\u00FE"
+               List<TestVector> TEST_VECTOR = Arrays.asList(
+                       /*000*/ new TestVector(0x0000001, ""),
+                       /*001*/ new TestVector(0x0000001, "abc"),
+                       /*002*/ new TestVector(0x0000001, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
+                       /*003*/ new TestVector(0x0000001, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
+                       /*004*/ new TestVector(0x0000001, "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern"),
+                       /*005*/ new TestVector(0x0000001, "Frank jagt im komplett verwahrlosten Taxi quer durch Bayern"),
+                       /*006*/ new TestVector(0x0000001, "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.\nAt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.\nConsetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo."),
+                       /*007*/ new TestVector(0x0000001, "\u0092\u00AD\u00ACI\u007F\u00FA\u00B3\u000B@\u00ACgO\u009DS\u00A9\u00A6$\u00B2G\u00FA#r\u0094\u00FAu\u0088A\u00A8_M\u00DE\u00FD\u00DB\u00FD#q\u00C1\u00E2\u00CA\u00F8[\u000E\u0006K\u00BCO:\u00C0\u00A9\u00C6\u00FDl\u0018]\u00C4\u00B1,\u008A\u00AC\u00C3\u00E6%\u00BD\u00E8z\u00DF\u00CB\u00FF`\u001B\u00F0f\u00DF\u0008|\nc\u00CE,\u0011\u00D6d\u008D\u001E\u00D0W\u00CE\u001B]\u0093\u00C6\u00CBo3\u0019\u0081\u00B9\u00FC\u00B5\u00BC\u00F4\u00FBowPT\u0006\u00D7\u001A\u0087\u00EC~\u00C1\u0099U\u0097\u00FB\u00B7\u0096\u009D\u00EC\r\u00AD\u0001\u0093\u009E\u0088\u0089\u00F50\u0096?\u00E9.#\u00A8\u00F5\u00DA\u00E5G>,\u001E\"8*\u00D4\u00F7\u000E\u00A2\u00E4^\u00BB\u00CB\u00AD\u0011\u00C8zt\u008Fx\u00CBVw\u008E\u00F4\u001C\n\u00EC\u00A5c.u\u00E3R\u00B2\u00EA\u00B5S<\u0006\u00F7\u00C6\u0080\u008Ew\u00D0\u000B-\u00B5\u00F9d\u00F5\u009F\u0089\u0083\u00D9%y\"&\u00E2\u00F3\u00E6\u00D4\u00B0\u00FD\u00E7\u00BAtlY\u00BA\u009A\u0020!,%\u00DA\u0002\u00D2:\u00EE_\u0088Zu\u00F1\u001A\u00C5\u00BD\u00D5\u00CCo\u009CKr\u00BCG\u00D8@\u0089r\u0000\u00F1\u00B7\u00EF\u0097\u007F#R,\u00838\u00A3\u00FC\u00FD\u00D7r\u00C6\u0015\u00D3J\u0093F\u00BC\u00B1\u00CE7\u0014\u00FC\u000E+\u00CB\u0099\u00C74M\u00AC\u00D8H\u00A1\u00EEXCm\u00B4x\u00D00\u00E4\u0009\u00F1{:\u00E9`h\u00D9\u0006\u00F8Y\"jfG\u00D6\u0009\u008A\u0095\u0018;\u0001F\r)6{\u00A5\"\u00B4\u0005~0\u00AC\u008B\u00C2\u00D5L\u00BBcP\u000Bv\u00A16\u00EB6\u00A0w\u00D8\u00F7\u0098\u0014W\u0091\u000E\u008D\u009CB\u0095\u00E99B\u0001\u00C9\u00B8\u00DF\u0082\u0087\u00FF\u00E5\u00E6f\u0080\u000B\u0019\u00B4\u0013\u00AC\u00ECq*]5\u00C5\u00CA\u000FV\u00E6\u00A3QpX!\u00B2\u0020\u008D\u00C9\u00DE\u00CC%\u0019\u00D5\u00CF\u00A1\u00B9+h\u00BE\u00D2d2\u0094\u009B\u0002|\u00F2\u0000\u00FE=\u008B@\u00A2\u0019P\u000F\u00EEAa#\u00A8\u00C5\u00A3\u00F5\u00FC75\u001EjQB\u00AA3\u008D4\u0011\u00F8\u00B3\u00BD+t\u0099\u0016\u00FF\u00AD&\u008F\u0000\u00C5\u00F5\u001CY\"\u0002>\u00B1q\u0008C\u00BF\u00A7k\u00CD\u00033\u000ES\u009D\u00BA\u00E5(\u00CA\u0009\u00E6\u001B\u00AE\u0011v\u00A9z\u0089\u00DFH\u00DC\u0085\u00F1\u009A\u00ED\u009F\u00E1\u009F-\u00B7\u00DA!\u00BA\u00D1\u000C\u00CAg\u0005[\u00CC$[\u00EA\u00F0\u00B8l\u00C4\u00B8"),
+                       /*008*/ new TestVector(0x0000001, "\u0005\u0085{\u00AA\u00C0\u00C9\u00E8b`b\u00B0\u00A0\"\u0003\u0088\u00A6\u0084C\u00AA\u008Cw\u000C\u0082\u0094]5\u0082\u0098\u0004\u001C\u00DD\u00A8\u00D4N\u0090om\u00B9\u0081\u00E2{?\u0095t$>\u009FS{\u00EF\n%Gy\u0089\\\u00B6\u00B27\u00FCOto\u007F\u00CD\u00E3s\u008B\u00F5\u00D1\u00A2<\u00BCp\u00F1A\u0084\u00F2\u00EB7\u009B\u00CB\u00C3\u00D7F.R\u00C3\u0097:\u00B6t\u00F3\u00D5\u00BBZ\u00896\u00F3\u001D\u00D5\u00A1\u000E\u00F1\u008E\u00F4\u0017&\u00CEf\u0000(\u00DE\u0017=[;\u0083{\u00D3\u00AB\u00C4\u00A1\u00EF\u008AY\u00A2\u00E2\u00BAn\u0013\u00EE\u00EA\u0083k\u00C1\u00B1\u0017\u009Ce\u001A\u00BEE\u00A7\u00B2@\u0091\u0099\u0007\u009FK_\u00BE\u00F8\u00C6~N\n\u00FF[\u00B5Z|/\u009Ew\u00EE;\u00E0\u00B5b\u0080\"\u009D-\u0013\u00CB\u00BC3\u0080\u00DD\u00AB\u0015\u00AA\u00AD\u0004:\u00AD\u008C\u00D52M02\u00F0qG'^K\u0012\u00FB\u00EF{\u00AB\u0083\u00AC\u009D\u00CD\u00ED\u00EE,%i\u0019m`\u00EF\u0018\u00B5\u00A0\u0080\u009D\u00A2\u00831\u0087\u0007SR\u00E1[L\u001E\u00FFAa4\u001C>\u001F_\u00A2X\u00D7gV#\u00B6\u00EC\u00F5\u00BC'\u00CE\u00CD\u00B4\u00B2W\u00B1;\u00EB\u00A6X\u0095\u00E0\u00B5\u00E8\u00B1\u009E\u0018?K`\u0096N\u00FBY%\u0006\u00F4\u0095\u0083\u0080\u0098]\u009FY\u009B\u0083&\u0097\u0089\u00CE\u00AC\u00BB\u00D0\\\u00957\u00DC\u00E4\u00DD/\\\"\u009Ce\u0010\u00FBa\u00A1s\u00A1j\u0089a\u0093|\u00C8n\u0080\u00B8HWHO\u0088~j\u00CE\u0090\u00F3\u00EB\u00B3\u009FP\u00F0\u000F\u00B6)`(\u00E5\u008B\u00DF\u00EA\u00CA\u00FB<\u00DD\u00AA``s\u00B3\u00AEEO\u00C9\u001D\u00B2c10;\u0085\u00BA\u008A7A\u00D6ZR\u0011\u00A2*\u00119\u00D2\u001E-\u00BF\u001AS\u008A\u0013$\u00C7\u00A3\u00DE\u00BE\u000B#r\u00CC\u0092)\u00B8+\u0092\u008F\u0008\n\u00B4\u00A6Gv)9\u00BF@\u00BCY\u009F\u00CD\u009D\u00CF5Q\u0016\u00F5D@\u00A4\u00C3\u001D\u00A8\u008Cs\u00C0\u00A1\u0012\u0084\u0015M\u00B1{JD\u00F4\u0012\u008E\u000F\u00E4L~\\\u00B2\u0092_\u00A9\u00B3q\u00DA@Px\u00C7\u0002\u001F\u0020y\u0084\u00F3\u0091\u001FGG@g+R\u00A1g\u0091\u0005\u00CA\u00B4\u00AB\u00A8i@\u00FD\u007F(\u00F6\u0017\u00B0\u00DD\u001A\u0082\u000F\u0020]\u00D29\u00A8\u009As\u00F1\u00AC\u0010\u0018<i\u0099I\u00B8\u00B2\u0090$\u00B5.\u000CW\u0093j\u001B\u000B\u009C\u00B9\u00F5Eq\u00DD\u00AF\u0094o\u00A5\u00F5\u00CF\u00B1\u00BC\u001C\u000E^Z\u000E\u00F6\u009D\u009Eq\u0011\u0099\u009F\u00A4W\u00E6m\u00D5\u0083\u0000\u00D7\u0085\u000CT\u0001\u00D4I\u001C\u00F6\u008C\u008E\u0000\u008B\u00F8HPMo\u00F1\u00EA\u00EF-d\u00D4\u00F5\u0000\u00A9\u0003\u00E6\u00CB_\u00CFl\u00D6&\u00C1\u00F4\u0097\u00CF\u00B5\u0016\u00A1b\u00DE\u00FF\u00C2\u0000\u00D0\u009A^\u00BB\u00B4v\u0086\u00FDK\u00F2)O\u000Fi\u0015}\u00AC\u00AA+\u00D1\u00BAn\u00A2\u001A\u00C1k\u009A\u0014\u0090c\u00BD\u00C416\u00BB&\u00A7i}\u0011v\u00E5?\u0005\u00C5Om\u00B0\u0012.\u00BCr\u0018\u008A\u000F\u0007\u00A1*\u00D0\u00C0\u00DE+c\u0019n\u00A8\u007F\u00C7\u009DG/\u00A6b\u00A3W\u00F07X\u009F\u0080M\u009D\u00A9/*9y\u0016j\u00CA\u00DF\"\u008F/\u00AA\u00A2ru\u0096c\u0019\u00E2\u00DF~7\u001Dh\u00F8\u00D9]\u008D@#\u007F\u00F5\u001B@3\u00CB8\u0081OJ^%<\u00F0\u0019\u00D7\u0001\u00D1!\u00F6\u00C5o\u00DA\u0017\u0083`9%f\u00F2%1X\u00A6\u00A4\u00ADFx\u00E7vW\u0019\u00CB|\u009Cm\u00E0m\u00F8\u00FD(\u0014\u0014\r\u00F0\u000C\u008F\u00D4hY\u00D2\u0096\u0015\u00BF\u00EC\u008A4\u00F7\u001A;,\u008CJ\u0098\u00167}\u0095\u0015\u00BDE\u00CB\u00F8\u00C1\u00A1\u009Ed:\u0017L\u00C4\u00D2\u00D1\u00A0\u00A4\u00BDZy\u00CBS\u00BC7\u0084\u00C8O\u009B\u00D7\u0010B=&@\u00D6\u00F2P\u0020\u0017\u008C*\u0081:\u00B5\u00D2\u008Bf\u00E5\u009F\u00CB\u00EB)\u00C8A\u00D1\u00B1\u009F\u00BAw*\u0018\u00D7\u007F\u008DF`\u00FE\u00DB\u00E4\u00C1\u00A5s\u00DD\u0088{\u0017\u00AA=X0\u009B\u00F6\u00B2fN\u00AC\u00C3\u00E3\u00A4z\u00AE\u00DF3\u00BER\u0089\u00B7\u00F9\u00B0\u0018\u00FBpc\u009A\u00C2\u00B5\u00FD\u00EF<\u008E\u0091i_\u00A8\u00E0\u00F6\u0083%\u00EF\u0016\u00AA\u00AF'\u00B5\u00D5,XW5g]\u00111\u00A3%9\r\\\u00F1\u00AC\u00D4\u00FB\u0003L\u008A\u00C0\u00FB\u00B2\u00E5\u000E\u00AD\u007F\u00C9\u00B13\u00AE\u00D9\u00EE=q\u00CB#T\u00F9\u007F\u00BF\u0002M\u00E1\u00D2\u00BCf\u00A9\\\u009D6GZbv\u00EF\u00C5\u00C80\u00BCxy\u0092b\u00A8\u00E9\u000B\u0083\u00E5\u0091B\u008F\u00FC\u00E9\u00A8l\u00AB\u00A9u\u00A1\u009Bk\u00A2\u00E5\u0087\u0096\u00BE\u0016\u0084\n\u0004)\u009F.-\u00C9\u00C8\u00DA\u00EA\u00F6\u009A%\u000F\u00F8\u00C0\u00FD\u00B5\u00D7\u0082"),
+                       /*009*/ new TestVector(0x0000001, "\u00FF\u00D3\u00B0\u00A7-oh:\u000B\u0080u\u00AA\u00E0\u00E7\u001Ew2\u0081}te\u00EE\u0085\u00B5z\u00D8\u00D6S\u00CE\u009FO\u00B7\u00BD\u00D4\u00B0\u00B6{D\u00A5,.i\u00C9`\u00E3\u00AE\u00C7\u00ADf\u0004\u00DC\u001D\u00B1\u00AE\u00B2\u00AE^\u00F0x\u00CB\u0008\u00FF@\u001C64\u000C\u0010\u00E3A\u009B\u0080\u008Fb\u00BF\u00D6%\u00B7-t\u0083O$~\u00BA\u00B7\r\u0087\u009A\\r\u00E6\u00F0\u0009yQ+\u001F\u00E6J\u00C0\"\u0017Xf\u00E9\u008B\u00B2\u0092\u00E3b\u00FCsn\u00BCr\u00D5\u00CF\u0008\u0005K\u00B6\u0014<\u00913>`\u00BA\u0081\u00C3\u00FD2\u00A9\u00B7d\u00D8\u001F\u009BDc-\u001Ap\u00E1\u00F5N\u00A0\u008D<\u0020\u008CFY\u00F5\u00F4\u00E2\u00E6\u00A2\u00A7\u00E8\u0018\u00CBM\u00DBZ\u00C6\u0090\u0093\u00AC\u00DFj\u00FF\u00D1\u0000\u0096O\u00FC\u00EF\u00B7j\u00EB\u00BB\u00870O\u00FC\u0019\u00CE\u00123\u00C1\u0013\u00DE\u00DF\u00A3{\u0089\u00C2\u00A3\u00DC\u00A4\u00A9\u00BD\u0004\u0010\u0096\u00EE\u00B8w\u00FA\u0098\\B\u0001\u00F3\u00F5\u00D4\u00EF\u0018\u000E\u00B4\u000F.,\u00FC\u009A\u00D0\u00CFL\u0099\u00E1\u0020\u00F0e[\u00FE\u00AF\u00F0\u009B\u00B5\u00DF\u00D5+\u00C2=\u00B0\u00FD\u00E81<\u007F\u00A6eo\u00BA\u000E\u00D9\u00C9\u008D[\u00D1\u00EA|\u007FKR\u00ED\u0080O&\u0017\u0095\u0091k\u00B8\u0008,\u001EbO\u00D2\u00D0z\u0000u\u00A6\u0013)\u0093\u00CB\u00C4\u00C5\u00A7\u009E\u0090\u00B1|\u008C\u001CzYl\u001D]\u00FCF\u00AF\u000C\u0096\u00BA1\u0095D{\u00CB^\u00ABdB\u00F75z\u001F\u0087\u00F2\u00B3>B3(\u00CFRGG\u0013\u009A\u00A3c\u00D1\u00BDz\u00F0\u000C\u0090h\u001D\u000C\u0003\u0083\u00A9\u008E\u009Dz\\j\u001Ef\u00A9\u00F1+\u00B8\u00CE\u00A2\u00D2+\u0017!\u00B1\u0083\u0087\u00FC\u00F1\u00F3Fx\u00DC\u00D3\u0096f\u00C2\u00B4\u00D3\u0083\u0002\u00A8\u00D7\u00A5\u0095\u00DF0\u0004\u00F2\u00D1R\u008CZDbh\u00BC\u00CD\u00A7i\u00CBN\u00B4[\u0010\u0083Y\u00AC()\u0013\u0004\u00C3\u00B2z\u00C55\u00A7\u00B0\n\u00D4\u00F0\u00F0\u00EC\u00B4\u00C0\u00F2\u00D2\u00C2+\u0088\u0003\u00D5\u00E6No\u00EF\u00AD}\u00D8\u000F\u00F0l\u00B0\u00B1\u0009\u00D8\u009D\u0099\u0014\u00E3\u0000\u0005#\u00C7\u0015\u00B9\u00B1\u00B7\u00F1\u00EE\u009F\u00CE\u00049\u00B7\u00E2M\u000CZ\u0013zr\u0008!\u0011(\u00B25\u00ECz\u00E5#\u00D5f\u00D6Lz\u0082\u00FDn\u001F:\u0001\u00DC8:!{#\u00B5\u00FA\u00CC\u0005e\u008D\u00DC\u00DA\\\u00A7\n\u001A\u00A0\u0002\u00F4\u00B6\u00A024w\u00C5\u00E2\u00BB\u0010F\u00CEW\u00E3\u00A9\u000Bes\u008F\u00D5\u00A5\u0017\u0083\u0000\u00BD@\u00B1\u00EED\u00F4\u00EB([\u0096\u00A6\u00C1\u0094\u00D3\u00B6K\u00AE\u00F4r\u00F6\u00EC\u00AC\u00D4R\u009E\u00C7z\u00A8K=\u001D\u00BC\u00C0W{\u0091b\u00EEMg\u00F3\u00BA\u008D\u00BBm\u00E7H^\u00BE\u0016H\u0085lRH\u0000\u00FF\u0006\u0095\u00E1~\u00D9\u0013\u0098\u00E0m\u0096\u0013\u00B7K(;\u00AC\u00C5\n7\u0085\u00BBn\u00E5\u00E9/,\u000E\u009E\u00B7D\u00E7\u0085\u00F2[\u00FD\u00EE\u008B\u00C2\u00B80\u00E0\u0081)\u0094\u00DB3\u00FF\u00882\u0091\u00F9\u00CB\u0014\u00BC-\u0091&\u0013J\u00A2\u00E2\u00D7\u00D0\u00CA\u009F\u001F6z\u0012}\u000C\u009A\u000B\u00E6\\\u00E2\u00B7M\u00E5\u000B\u00A4>%\u00F8\u00D9\u008D\u009D\u00F4\u00E3,\u008A\u009B\u0098\u00ADk\u00F5\u000F\u00FB}\u00DA*\u00FE!\u0018v\u009A\u001AU\u00FC%\u00CA>\u00F9\u00FD\u00E4\u00B6-\u0010>Xy\u00D80\u00ED\u00DDK\u00B6\u000F\u00D5\u00D6\u00F6\u00B4\u00B17|N)\u00E6\u00F7y#t\u0001f_\u0002\u00EB\u00F2\u009FQ\u000291\u00AA\u008B\u00BC\u00DEnZm\u00AF:\u0084#4\u00F4\u0013\u009C\u0004\u00FD~l\u00E7\"\u00CC\u00B92k\u00D9\u00C2w\u00C2{\u00DF\u00E9\u00B6\u0017S\u00AF{\u00A6\u0094\u00AE99\u0000\u00EFu\u00E2M\u0015\u00F6E\u001A\u00B2\u009F\u00D6\u0082$E\u00B2\u0007\u00A7\u0000=\u0014\u0001b@\u00DD\u00D2\u00B8\u00F0\u0096\u009B\u0007\u000CI\u00F8t\u00B2\u00BF\u00E91\u00B3.\u009D/0\u00C2\u00F6\u00EDLVB\u00D4GUj\u00F49\u00C2#_X\u00BD,{\u00C5J\u00DC\u008A\u00AD@\u00E5\u0084\u00A0e\u00B3est\u009F\u00AB\u00BD\u00E6\u0009\u00A2$e\u008D\u00F6[[\u0014K\u00C0jx\u00F2\u00D6\u00F3vE\u00A0w\u00DD\u00AA\u00DB\u0013\u00F9\u009F\u000FZ\u00A5\u00A0\u00B9(H\u0095$\u0003-\u0094n\u00E1\u0005\u00F7\\#\u0082)\u0095\u00A1|\u00F2\u00E3\u00B9/\u00AC)\u0011\u00EC`\u00D1L_\u00B8\u00D2\u001E\u009D\u00ECv\u001D\u00FC_\u00C0\u00FE\u00D1P3\nB\u00D7\u0083\u00C9\u00F9IT\u00BBP\u0017lk8\u00C11\u0019\u00DB\u00FC\u00DE\u00CE\u0017\u00AD\u00B2\u00D1\u00DA\n\u0013\u00EE+\u00ED:\u00EA\u00EA\u0020\u008E\u0017\u0014\u000B\u0088\u00EE\u00B9\u00A5\u0002\u001B\u00E8l\u00F7\u00FB\u00E4\u0018r\u00E75\u0088\u00DE\u008E\u00B8V\u00FB\u00D9\u008C\u00B8\u0081\u00A79\u00AC\u00F2\u00D29\u000B\u00AF\u007F\u00B6\u00D2\u000E\u00A5\u00C7\u00A0\u00B3\u00EFoK\u00F4\u0008x\u00B2\u00A8\u0089\u00CD\u000E\u000E\u008A\u00B1\u008F\u008C\u00AC\u00E3##\u00B6\u00D1l\u0080\u00FD\u00F5Me;u\u0017\u00FC\u0081\u00A3\u0088\u0015*\u00EE\u0019\u00E0\u00FD\u00F5\u00F1\u00C2\u00C3\u00DD\u00EEz\u0008\u0012%ruBw\u008DQ[\u00D61a\u0088!s\u0086.\u00E5\u008E\u000B>\u00BEa\u00B8\u00E4\u00FD\u00FAg\u00C6Dx\u00B21\u00D9\u008B\u00BF\u00A8\u0007\u008F~\u00BEFTS$\u009A%\u00E5\u00D3_\u00C0\"\u0020\u00EA\u00C0\u0086\u00CDl\u00F8zJl\u0018\u00BD\u000F\u00CC\u00F3_\u007F\u00E0\u00BE\u00B0S\u0094_\u00E0\u0089\u0011\u0086\u0092\u00F2?\u001A\u00BD\u00E8h\u00B85;\u0091\u008F\u0085s\u0098\u00B9~\u00D1\u00C0\u00AD\u00F8Mr\u0004O\u001D\u00AD\u0082_\u0086\u00DD\u0089\u0017s8\u00F8%4\u00BAW$\u00F8\u00F3\u00E3P\u00AEA\u00D9\u0091\u00F8\u00AC\u008E\u00C4\u0087\u00F6X\u00D2\u001C1\u009B\u00C9\u000E(V\u00C9_\u0009Cs\u00A0y\u0013X\u00F2^%\u0089\u008F\u0017X\u009E\u00B3^0l\u008A\u00AB\u0081C'lS\u0082\u0008\u0019\u00B9\u00C0\u00FB\u00DA\u00F4\u00DD\u00BDUf\u008Dq\u00FFg@NS\u00B3p\"{\u0080\u0020\u008C\u0092?\u000Fs\u00AB\u00F1\u00E4Z\u00A2W=\u00DF\u00DE9\u00D0\u00E5G\u001CA\u00DAz\u0095\u000C^\u00E4\u00A3\u00844n>\u00A4\u009A\u00FD\"F\u00A9yei\u0019j\u00CE\u008A\u00E9X\u0094J\u00E1\u00D9q\u0002\u00D9\u008FF\u00A6\\YH\u001Fc\u0097\u001F\u00AF\u00FC\u0011\u00F0\u0008\u0002\u0011\u0002\u00FFp\u00A4\u00E7:\u00B9\\\u00F1p\u00CAX\u00F3\u001A\u0000\u0014\u00FA|\u00BF~\u001B\u00DE~\u00D6OX@\u00FB\u008F\u00EA\u00DC\u008B\u00EC\u00E2*\u00DD9\u0097\u0004\u00BE=\u008E\u000C\u00AD\u009BH\u00EF\u0092_v\u00E3\u000C\r@\u0020\u0008JF\u00E7e8\u00F1\u00B4C\u00E6\u0099\u0006]\u00D5M{\u00DF\u00D6Fz\u0092UV\u0008\u00E4_\u0008\u00D8\u00C5\u0094\u00A6^\u00FE;\u00EC\u00A3\u00E8T\u0090+\u00F7\u00F37%\u0090&\n\u001Cx\u00E6\u00E5\u008D\u00FFS\u0096K\u00BB\u00E4\u00DEF\u0005h|\u00BF\u0005\u0019\u00D4\u00D2\u00C6\u008E\u00AE\u00E9E1`\u00F8L\u00D1\u009A\u00F1\u00CAnna3\u00D0W\u0015\u000E\u0015j\u0014\u0006\u001D\u00CEe\u00CAEq\u00A7\u00BBz\u00DE\u00CE\u00F6\u00EAb\u00A6\u00FAT\u00C1\u00AE\u00B4w&\u0007\u00C0\u00100\u00B1\u00CC$\u00BF\u00E8E\u00C2\u00A9\u00D3Kf\u00A1\u00E3\u00F0W\u00B0\u00FE"),
+                       /*010*/ new TestVector(0x1000000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno")
                );
                
                final List<ByteString> TEST_RESULT = buildTable(
@@ -1486,7 +1498,8 @@ public final class MHash384 {
                        /*006*/ "\u000F\u00E9\u008E\u00B3J\u00B7\u00BD/\u00B1\u00E2y\u00E3\u00B9\u009E\u00CD6r\u00CD\n\u00B6?l[t\u00EA\u00B8\u008E\u0007\u00E6L\u00A6'\u00F7\u00DC\u00E7\"\u00E0\u00D9\u00B6`\u001Bk^\u0003C\u00D10J",
                        /*007*/ "\u00C3\u00A0V\u0086\u00C7[\u0002\u00B4B8\u0014\u00BC\u0005\u001A\u0011Tb\u00155\u00A8\u008B\u00E1\u00D3\u00001\u0097\u001C\u008B\u00A4\u00F5^N\u00EF\u0094\u0010W\u00AD\u009C~c,\u00AA\u00A3\u00E0\u0017\u00BC\u00FE\u0097",
                        /*008*/ "h\u00C5/\u00C23\u0020\u000E\u00CDC\u00A1\u0093\u00C1\u00FD'e\u001F\u000Fp\u0089\u0006;J\u0007L\u001A\\$\nf\u00BAx\u00F3\u00E6\u009FZ\u009EYr\u0017OR\u0017(a\u00B1\n)5",
-                       /*009*/ "8\u0013[\u001FLZ+\u00EA\u00C0\u00E5\u00F7\u0011\u0080\u00A7\u00F7\u00FA\u0003\u00C7\u00E6\u00F7\u00F1A\u00B4:\u0015\u00DA&\u0010V\u00D9\u00BB{*\u00D6\u00BA\u001B\u0005\u00DD8\u0088\u00E6K\u00A8\u00B0\u0099\u00F5Wh"
+                       /*009*/ "8\u0013[\u001FLZ+\u00EA\u00C0\u00E5\u00F7\u0011\u0080\u00A7\u00F7\u00FA\u0003\u00C7\u00E6\u00F7\u00F1A\u00B4:\u0015\u00DA&\u0010V\u00D9\u00BB{*\u00D6\u00BA\u001B\u0005\u00DD8\u0088\u00E6K\u00A8\u00B0\u0099\u00F5Wh",
+                       /*010*/ "3e\u0081\u001C\u0097\u000B\u00B9US\u0000\u00DABk7\u0020\u00FAi\\\u00C4\u00B7\u00E7<\u00C9Z75\u00B1\u0009\u009A\u00C4&;t\u00FAQ\u00B5\u0019\u00D3\u008F\u00ED\u0003\u0094\u00A1<\u001F\u00D2F\u00E1"
                );
                
                if(TABLE_XOR.size() != TABLE_XOR_SIZE) {
@@ -1508,9 +1521,11 @@ public final class MHash384 {
                }
                
                final Iterator<ByteString> expected = TEST_RESULT.iterator();
-               for(final ByteString testInput : TEST_VECTOR) {
+               for(final TestVector testVector : TEST_VECTOR) {
                        MHash384 subject = new MHash384();
-                       subject.update(testInput);
+                       for(int j = 0; j < testVector.iterations; ++j) {
+                               subject.update(testVector.message);
+                       }
                        final ByteString result = subject.digest();
                        System.out.println(result);
                        if(!result.equals(expected.next())) {
diff --git a/bindings/Java/library/src/com/muldersoft/mhash384/package-info.java b/bindings/Java/library/src/com/muldersoft/mhash384/package-info.java
new file mode 100644 (file)
index 0000000..7500bf7
--- /dev/null
@@ -0,0 +1,5 @@
+/**
+ * MHash-384, a simple fast portable header-only hashing library
+ * Copyright(c) 2016-2017 LoRd_MuldeR <mulder2@gmx.de>
+ */
+package com.muldersoft.mhash384;
\ No newline at end of file
index 08459ca..ac7f155 100644 (file)
@@ -32,6 +32,117 @@ namespace MHashDotNet384
     public sealed class MHash384
     {
         //=====================================================================
+        // HELPER CLASSES
+        //=====================================================================
+
+        // ConstArray<T>
+        public struct ConstArray<T> : IEnumerable<T>
+        {
+            private readonly T[] m_data;
+
+            public ConstArray(params T[] data)
+            {
+                m_data = (T[])data.Clone();
+            }
+
+            public T this[int i]
+            {
+                [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                get { return m_data[i]; }
+            }
+
+            public int Length
+            {
+                [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                get { return m_data.Length; }
+            }
+
+            public override bool Equals(Object other)
+            {
+                if (other.GetType().Equals(typeof(ConstArray<T>)))
+                {
+                    return m_data.SequenceEqual((ConstArray<T>)other);
+                }
+                return false;
+            }
+
+            public override int GetHashCode()
+            {
+                int hashCode = 0;
+                foreach (T element in m_data)
+                {
+                    hashCode = hashCode ^ element.GetHashCode();
+                }
+                return hashCode;
+            }
+
+            [MethodImpl(MethodImplOptions.AggressiveInlining)]
+            public IEnumerator<T> GetEnumerator()
+            {
+                return new ConstArrayEnum<T>(this);
+            }
+
+            [MethodImpl(MethodImplOptions.AggressiveInlining)]
+            IEnumerator IEnumerable.GetEnumerator()
+            {
+                return new ConstArrayEnum<T>(this);
+            }
+
+            // ConstArray Enumerator
+            private struct ConstArrayEnum<U> : IEnumerator<U>
+            {
+                private int index;
+                private readonly ConstArray<U> data;
+
+                public ConstArrayEnum(ConstArray<U> data)
+                {
+                    index = -1;
+                    this.data = data;
+                }
+
+                U IEnumerator<U>.Current
+                {
+                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                    get { return data[index]; }
+                }
+
+                public object Current
+                {
+                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                    get { return data[index]; }
+                }
+
+                [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                public bool MoveNext()
+                {
+                    return (++index < data.Length);
+                }
+
+                [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                public void Reset()
+                {
+                    index = -1;
+                }
+
+                [MethodImpl(MethodImplOptions.AggressiveInlining)]
+                public void Dispose() { }
+            }
+        }
+
+        // TestVector
+        private struct TestVector
+        {
+            public readonly uint itrations;
+            public readonly String message;
+
+            public TestVector(uint itrations, String message)
+            {
+                this.itrations = itrations;
+                this.message = message;
+            }
+        }
+
+        //=====================================================================
         // CONSTANTS
         //=====================================================================
 
@@ -1307,119 +1418,6 @@ namespace MHashDotNet384
         private readonly int TSIZE_MIX = TABLE_MIX.Length;
 
         //=====================================================================
-        // HELPER CLASSES
-        //=====================================================================
-
-        // ConstArray<T>
-        public struct ConstArray<T> : IEnumerable<T>
-        {
-            private readonly T[] m_data;
-
-            public ConstArray(params T[] data)
-            {
-                m_data = (T[])data.Clone();
-            }
-
-            public T this[int i]
-            {
-                [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                get { return m_data[i]; }
-            }
-
-            public int Length
-            {
-                [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                get { return m_data.Length; }
-            }
-
-            public override bool Equals(Object other)
-            {
-                if(other.GetType().Equals(typeof(ConstArray<T>)))
-                {
-                    return m_data.SequenceEqual((ConstArray<T>)other);
-                }
-                return false;
-            }
-
-            public override int GetHashCode()
-            {
-                int hashCode = 0;
-                foreach(T element in m_data)
-                {
-                    hashCode = hashCode ^ element.GetHashCode();
-                }
-                return hashCode;
-            }
-
-            [MethodImpl(MethodImplOptions.AggressiveInlining)]
-            public IEnumerator<T> GetEnumerator()
-            {
-                return new ConstArrayEnum<T>(this);
-            }
-
-            [MethodImpl(MethodImplOptions.AggressiveInlining)]
-            IEnumerator IEnumerable.GetEnumerator()
-            {
-                return new ConstArrayEnum<T>(this);
-            }
-
-            // ConstArray Enumerator
-            private struct ConstArrayEnum<U> : IEnumerator<U>
-            {
-                private int index;
-                private readonly ConstArray<U> data;
-
-                public ConstArrayEnum(ConstArray<U> data)
-                {
-                    index = -1;
-                    this.data = data;
-                }
-
-                U IEnumerator<U>.Current
-                {
-                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                    get { return data[index]; }
-                }
-
-                public object Current
-                {
-                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                    get { return data[index]; }
-                }
-
-                [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                public bool MoveNext()
-                {
-                    return (++index < data.Length);
-                }
-
-                [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                public void Reset()
-                {
-                    index = -1;
-                }
-
-                [MethodImpl(MethodImplOptions.AggressiveInlining)]
-                public void Dispose() { }
-            }
-        }
-
-        // TestVector
-        private struct TestVector
-        {
-            public readonly uint itrations;
-            public readonly uint len;
-            public readonly String message;
-
-            public TestVector(uint itrations, uint len, String message)
-            {
-                this.itrations = itrations;
-                this.len = len;
-                this.message = message;
-            }
-        }
-
-        //=====================================================================
         // HASH STATE
         //=====================================================================
 
@@ -1548,31 +1546,31 @@ namespace MHashDotNet384
         public static void SelfTest()
         {
             ConstArray<TestVector> TEST_VECTOR = new ConstArray<TestVector>(
-                new TestVector(0x0000001, 0x000, ""),
-                new TestVector(0x0000001, 0x000, "abc"),
-                new TestVector(0x0000001, 0x000, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
-                new TestVector(0x0000001, 0x000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
-                new TestVector(0x0000001, 0x000, "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern"),
-                new TestVector(0x0000001, 0x000, "Frank jagt im komplett verwahrlosten Taxi quer durch Bayern"),
-                new TestVector(0x0000001, 0x000, "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.\nAt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.\nConsetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo."),
-                new TestVector(0x0000001, 0x200, "\x92\xAD\xAC\x49\x7F\xFA\xB3\x0B\x40\xAC\x67\x4F\x9D\x53\xA9\xA6\x24\xB2\x47\xFA\x23\x72\x94\xFA\x75\x88\x41\xA8\x5F\x4D\xDE\xFD\xDB\xFD\x23\x71\xC1\xE2\xCA\xF8\x5B\x0E\x06\x4B\xBC\x4F\x3A\xC0\xA9\xC6\xFD\x6C\x18\x5D\xC4\xB1\x2C\x8A\xAC\xC3\xE6\x25\xBD\xE8\x7A\xDF\xCB\xFF\x60\x1B\xF0\x66\xDF\x08\x7C\x0A\x63\xCE\x2C\x11\xD6\x64\x8D\x1E\xD0\x57\xCE\x1B\x5D\x93\xC6\xCB\x6F\x33\x19\x81\xB9\xFC\xB5\xBC\xF4\xFB\x6F\x77\x50\x54\x06\xD7\x1A\x87\xEC\x7E\xC1\x99\x55\x97\xFB\xB7\x96\x9D\xEC\x0D\xAD\x01\x93\x9E\x88\x89\xF5\x30\x96\x3F\xE9\x2E\x23\xA8\xF5\xDA\xE5\x47\x3E\x2C\x1E\x22\x38\x2A\xD4\xF7\x0E\xA2\xE4\x5E\xBB\xCB\xAD\x11\xC8\x7A\x74\x8F\x78\xCB\x56\x77\x8E\xF4\x1C\x0A\xEC\xA5\x63\x2E\x75\xE3\x52\xB2\xEA\xB5\x53\x3C\x06\xF7\xC6\x80\x8E\x77\xD0\x0B\x2D\xB5\xF9\x64\xF5\x9F\x89\x83\xD9\x25\x79\x22\x26\xE2\xF3\xE6\xD4\xB0\xFD\xE7\xBA\x74\x6C\x59\xBA\x9A\x20\x21\x2C\x25\xDA\x02\xD2\x3A\xEE\x5F\x88\x5A\x75\xF1\x1A\xC5\xBD\xD5\xCC\x6F\x9C\x4B\x72\xBC\x47\xD8\x40\x89\x72\x00\xF1\xB7\xEF\x97\x7F\x23\x52\x2C\x83\x38\xA3\xFC\xFD\xD7\x72\xC6\x15\xD3\x4A\x93\x46\xBC\xB1\xCE\x37\x14\xFC\x0E\x2B\xCB\x99\xC7\x34\x4D\xAC\xD8\x48\xA1\xEE\x58\x43\x6D\xB4\x78\xD0\x30\xE4\x09\xF1\x7B\x3A\xE9\x60\x68\xD9\x06\xF8\x59\x22\x6A\x66\x47\xD6\x09\x8A\x95\x18\x3B\x01\x46\x0D\x29\x36\x7B\xA5\x22\xB4\x05\x7E\x30\xAC\x8B\xC2\xD5\x4C\xBB\x63\x50\x0B\x76\xA1\x36\xEB\x36\xA0\x77\xD8\xF7\x98\x14\x57\x91\x0E\x8D\x9C\x42\x95\xE9\x39\x42\x01\xC9\xB8\xDF\x82\x87\xFF\xE5\xE6\x66\x80\x0B\x19\xB4\x13\xAC\xEC\x71\x2A\x5D\x35\xC5\xCA\x0F\x56\xE6\xA3\x51\x70\x58\x21\xB2\x20\x8D\xC9\xDE\xCC\x25\x19\xD5\xCF\xA1\xB9\x2B\x68\xBE\xD2\x64\x32\x94\x9B\x02\x7C\xF2\x00\xFE\x3D\x8B\x40\xA2\x19\x50\x0F\xEE\x41\x61\x23\xA8\xC5\xA3\xF5\xFC\x37\x35\x1E\x6A\x51\x42\xAA\x33\x8D\x34\x11\xF8\xB3\xBD\x2B\x74\x99\x16\xFF\xAD\x26\x8F\x00\xC5\xF5\x1C\x59\x22\x02\x3E\xB1\x71\x08\x43\xBF\xA7\x6B\xCD\x03\x33\x0E\x53\x9D\xBA\xE5\x28\xCA\x09\xE6\x1B\xAE\x11\x76\xA9\x7A\x89\xDF\x48\xDC\x85\xF1\x9A\xED\x9F\xE1\x9F\x2D\xB7\xDA\x21\xBA\xD1\x0C\xCA\x67\x05\x5B\xCC\x24\x5B\xEA\xF0\xB8\x6C\xC4\xB8"),
-                new TestVector(0x0000001, 0x400, "\x05\x85\x7B\xAA\xC0\xC9\xE8\x62\x60\x62\xB0\xA0\x22\x03\x88\xA6\x84\x43\xAA\x8C\x77\x0C\x82\x94\x5D\x35\x82\x98\x04\x1C\xDD\xA8\xD4\x4E\x90\x6F\x6D\xB9\x81\xE2\x7B\x3F\x95\x74\x24\x3E\x9F\x53\x7B\xEF\x0A\x25\x47\x79\x89\x5C\xB6\xB2\x37\xFC\x4F\x74\x6F\x7F\xCD\xE3\x73\x8B\xF5\xD1\xA2\x3C\xBC\x70\xF1\x41\x84\xF2\xEB\x37\x9B\xCB\xC3\xD7\x46\x2E\x52\xC3\x97\x3A\xB6\x74\xF3\xD5\xBB\x5A\x89\x36\xF3\x1D\xD5\xA1\x0E\xF1\x8E\xF4\x17\x26\xCE\x66\x00\x28\xDE\x17\x3D\x5B\x3B\x83\x7B\xD3\xAB\xC4\xA1\xEF\x8A\x59\xA2\xE2\xBA\x6E\x13\xEE\xEA\x83\x6B\xC1\xB1\x17\x9C\x65\x1A\xBE\x45\xA7\xB2\x40\x91\x99\x07\x9F\x4B\x5F\xBE\xF8\xC6\x7E\x4E\x0A\xFF\x5B\xB5\x5A\x7C\x2F\x9E\x77\xEE\x3B\xE0\xB5\x62\x80\x22\x9D\x2D\x13\xCB\xBC\x33\x80\xDD\xAB\x15\xAA\xAD\x04\x3A\xAD\x8C\xD5\x32\x4D\x30\x32\xF0\x71\x47\x27\x5E\x4B\x12\xFB\xEF\x7B\xAB\x83\xAC\x9D\xCD\xED\xEE\x2C\x25\x69\x19\x6D\x60\xEF\x18\xB5\xA0\x80\x9D\xA2\x83\x31\x87\x07\x53\x52\xE1\x5B\x4C\x1E\xFF\x41\x61\x34\x1C\x3E\x1F\x5F\xA2\x58\xD7\x67\x56\x23\xB6\xEC\xF5\xBC\x27\xCE\xCD\xB4\xB2\x57\xB1\x3B\xEB\xA6\x58\x95\xE0\xB5\xE8\xB1\x9E\x18\x3F\x4B\x60\x96\x4E\xFB\x59\x25\x06\xF4\x95\x83\x80\x98\x5D\x9F\x59\x9B\x83\x26\x97\x89\xCE\xAC\xBB\xD0\x5C\x95\x37\xDC\xE4\xDD\x2F\x5C\x22\x9C\x65\x10\xFB\x61\xA1\x73\xA1\x6A\x89\x61\x93\x7C\xC8\x6E\x80\xB8\x48\x57\x48\x4F\x88\x7E\x6A\xCE\x90\xF3\xEB\xB3\x9F\x50\xF0\x0F\xB6\x29\x60\x28\xE5\x8B\xDF\xEA\xCA\xFB\x3C\xDD\xAA\x60\x60\x73\xB3\xAE\x45\x4F\xC9\x1D\xB2\x63\x31\x30\x3B\x85\xBA\x8A\x37\x41\xD6\x5A\x52\x11\xA2\x2A\x11\x39\xD2\x1E\x2D\xBF\x1A\x53\x8A\x13\x24\xC7\xA3\xDE\xBE\x0B\x23\x72\xCC\x92\x29\xB8\x2B\x92\x8F\x08\x0A\xB4\xA6\x47\x76\x29\x39\xBF\x40\xBC\x59\x9F\xCD\x9D\xCF\x35\x51\x16\xF5\x44\x40\xA4\xC3\x1D\xA8\x8C\x73\xC0\xA1\x12\x84\x15\x4D\xB1\x7B\x4A\x44\xF4\x12\x8E\x0F\xE4\x4C\x7E\x5C\xB2\x92\x5F\xA9\xB3\x71\xDA\x40\x50\x78\xC7\x02\x1F\x20\x79\x84\xF3\x91\x1F\x47\x47\x40\x67\x2B\x52\xA1\x67\x91\x05\xCA\xB4\xAB\xA8\x69\x40\xFD\x7F\x28\xF6\x17\xB0\xDD\x1A\x82\x0F\x20\x5D\xD2\x39\xA8\x9A\x73\xF1\xAC\x10\x18\x3C\x69\x99\x49\xB8\xB2\x90\x24\xB5\x2E\x0C\x57\x93\x6A\x1B\x0B\x9C\xB9\xF5\x45\x71\xDD\xAF\x94\x6F\xA5\xF5\xCF\xB1\xBC\x1C\x0E\x5E\x5A\x0E\xF6\x9D\x9E\x71\x11\x99\x9F\xA4\x57\xE6\x6D\xD5\x83\x00\xD7\x85\x0C\x54\x01\xD4\x49\x1C\xF6\x8C\x8E\x00\x8B\xF8\x48\x50\x4D\x6F\xF1\xEA\xEF\x2D\x64\xD4\xF5\x00\xA9\x03\xE6\xCB\x5F\xCF\x6C\xD6\x26\xC1\xF4\x97\xCF\xB5\x16\xA1\x62\xDE\xFF\xC2\x00\xD0\x9A\x5E\xBB\xB4\x76\x86\xFD\x4B\xF2\x29\x4F\x0F\x69\x15\x7D\xAC\xAA\x2B\xD1\xBA\x6E\xA2\x1A\xC1\x6B\x9A\x14\x90\x63\xBD\xC4\x31\x36\xBB\x26\xA7\x69\x7D\x11\x76\xE5\x3F\x05\xC5\x4F\x6D\xB0\x12\x2E\xBC\x72\x18\x8A\x0F\x07\xA1\x2A\xD0\xC0\xDE\x2B\x63\x19\x6E\xA8\x7F\xC7\x9D\x47\x2F\xA6\x62\xA3\x57\xF0\x37\x58\x9F\x80\x4D\x9D\xA9\x2F\x2A\x39\x79\x16\x6A\xCA\xDF\x22\x8F\x2F\xAA\xA2\x72\x75\x96\x63\x19\xE2\xDF\x7E\x37\x1D\x68\xF8\xD9\x5D\x8D\x40\x23\x7F\xF5\x1B\x40\x33\xCB\x38\x81\x4F\x4A\x5E\x25\x3C\xF0\x19\xD7\x01\xD1\x21\xF6\xC5\x6F\xDA\x17\x83\x60\x39\x25\x66\xF2\x25\x31\x58\xA6\xA4\xAD\x46\x78\xE7\x76\x57\x19\xCB\x7C\x9C\x6D\xE0\x6D\xF8\xFD\x28\x14\x14\x0D\xF0\x0C\x8F\xD4\x68\x59\xD2\x96\x15\xBF\xEC\x8A\x34\xF7\x1A\x3B\x2C\x8C\x4A\x98\x16\x37\x7D\x95\x15\xBD\x45\xCB\xF8\xC1\xA1\x9E\x64\x3A\x17\x4C\xC4\xD2\xD1\xA0\xA4\xBD\x5A\x79\xCB\x53\xBC\x37\x84\xC8\x4F\x9B\xD7\x10\x42\x3D\x26\x40\xD6\xF2\x50\x20\x17\x8C\x2A\x81\x3A\xB5\xD2\x8B\x66\xE5\x9F\xCB\xEB\x29\xC8\x41\xD1\xB1\x9F\xBA\x77\x2A\x18\xD7\x7F\x8D\x46\x60\xFE\xDB\xE4\xC1\xA5\x73\xDD\x88\x7B\x17\xAA\x3D\x58\x30\x9B\xF6\xB2\x66\x4E\xAC\xC3\xE3\xA4\x7A\xAE\xDF\x33\xBE\x52\x89\xB7\xF9\xB0\x18\xFB\x70\x63\x9A\xC2\xB5\xFD\xEF\x3C\x8E\x91\x69\x5F\xA8\xE0\xF6\x83\x25\xEF\x16\xAA\xAF\x27\xB5\xD5\x2C\x58\x57\x35\x67\x5D\x11\x31\xA3\x25\x39\x0D\x5C\xF1\xAC\xD4\xFB\x03\x4C\x8A\xC0\xFB\xB2\xE5\x0E\xAD\x7F\xC9\xB1\x33\xAE\xD9\xEE\x3D\x71\xCB\x23\x54\xF9\x7F\xBF\x02\x4D\xE1\xD2\xBC\x66\xA9\x5C\x9D\x36\x47\x5A\x62\x76\xEF\xC5\xC8\x30\xBC\x78\x79\x92\x62\xA8\xE9\x0B\x83\xE5\x91\x42\x8F\xFC\xE9\xA8\x6C\xAB\xA9\x75\xA1\x9B\x6B\xA2\xE5\x87\x96\xBE\x16\x84\x0A\x04\x29\x9F\x2E\x2D\xC9\xC8\xDA\xEA\xF6\x9A\x25\x0F\xF8\xC0\xFD\xB5\xD7\x82"),
-                new TestVector(0x0000001, 0x600, "\xFF\xD3\xB0\xA7\x2D\x6F\x68\x3A\x0B\x80\x75\xAA\xE0\xE7\x1E\x77\x32\x81\x7D\x74\x65\xEE\x85\xB5\x7A\xD8\xD6\x53\xCE\x9F\x4F\xB7\xBD\xD4\xB0\xB6\x7B\x44\xA5\x2C\x2E\x69\xC9\x60\xE3\xAE\xC7\xAD\x66\x04\xDC\x1D\xB1\xAE\xB2\xAE\x5E\xF0\x78\xCB\x08\xFF\x40\x1C\x36\x34\x0C\x10\xE3\x41\x9B\x80\x8F\x62\xBF\xD6\x25\xB7\x2D\x74\x83\x4F\x24\x7E\xBA\xB7\x0D\x87\x9A\x5C\x72\xE6\xF0\x09\x79\x51\x2B\x1F\xE6\x4A\xC0\x22\x17\x58\x66\xE9\x8B\xB2\x92\xE3\x62\xFC\x73\x6E\xBC\x72\xD5\xCF\x08\x05\x4B\xB6\x14\x3C\x91\x33\x3E\x60\xBA\x81\xC3\xFD\x32\xA9\xB7\x64\xD8\x1F\x9B\x44\x63\x2D\x1A\x70\xE1\xF5\x4E\xA0\x8D\x3C\x20\x8C\x46\x59\xF5\xF4\xE2\xE6\xA2\xA7\xE8\x18\xCB\x4D\xDB\x5A\xC6\x90\x93\xAC\xDF\x6A\xFF\xD1\x00\x96\x4F\xFC\xEF\xB7\x6A\xEB\xBB\x87\x30\x4F\xFC\x19\xCE\x12\x33\xC1\x13\xDE\xDF\xA3\x7B\x89\xC2\xA3\xDC\xA4\xA9\xBD\x04\x10\x96\xEE\xB8\x77\xFA\x98\x5C\x42\x01\xF3\xF5\xD4\xEF\x18\x0E\xB4\x0F\x2E\x2C\xFC\x9A\xD0\xCF\x4C\x99\xE1\x20\xF0\x65\x5B\xFE\xAF\xF0\x9B\xB5\xDF\xD5\x2B\xC2\x3D\xB0\xFD\xE8\x31\x3C\x7F\xA6\x65\x6F\xBA\x0E\xD9\xC9\x8D\x5B\xD1\xEA\x7C\x7F\x4B\x52\xED\x80\x4F\x26\x17\x95\x91\x6B\xB8\x08\x2C\x1E\x62\x4F\xD2\xD0\x7A\x00\x75\xA6\x13\x29\x93\xCB\xC4\xC5\xA7\x9E\x90\xB1\x7C\x8C\x1C\x7A\x59\x6C\x1D\x5D\xFC\x46\xAF\x0C\x96\xBA\x31\x95\x44\x7B\xCB\x5E\xAB\x64\x42\xF7\x35\x7A\x1F\x87\xF2\xB3\x3E\x42\x33\x28\xCF\x52\x47\x47\x13\x9A\xA3\x63\xD1\xBD\x7A\xF0\x0C\x90\x68\x1D\x0C\x03\x83\xA9\x8E\x9D\x7A\x5C\x6A\x1E\x66\xA9\xF1\x2B\xB8\xCE\xA2\xD2\x2B\x17\x21\xB1\x83\x87\xFC\xF1\xF3\x46\x78\xDC\xD3\x96\x66\xC2\xB4\xD3\x83\x02\xA8\xD7\xA5\x95\xDF\x30\x04\xF2\xD1\x52\x8C\x5A\x44\x62\x68\xBC\xCD\xA7\x69\xCB\x4E\xB4\x5B\x10\x83\x59\xAC\x28\x29\x13\x04\xC3\xB2\x7A\xC5\x35\xA7\xB0\x0A\xD4\xF0\xF0\xEC\xB4\xC0\xF2\xD2\xC2\x2B\x88\x03\xD5\xE6\x4E\x6F\xEF\xAD\x7D\xD8\x0F\xF0\x6C\xB0\xB1\x09\xD8\x9D\x99\x14\xE3\x00\x05\x23\xC7\x15\xB9\xB1\xB7\xF1\xEE\x9F\xCE\x04\x39\xB7\xE2\x4D\x0C\x5A\x13\x7A\x72\x08\x21\x11\x28\xB2\x35\xEC\x7A\xE5\x23\xD5\x66\xD6\x4C\x7A\x82\xFD\x6E\x1F\x3A\x01\xDC\x38\x3A\x21\x7B\x23\xB5\xFA\xCC\x05\x65\x8D\xDC\xDA\x5C\xA7\x0A\x1A\xA0\x02\xF4\xB6\xA0\x32\x34\x77\xC5\xE2\xBB\x10\x46\xCE\x57\xE3\xA9\x0B\x65\x73\x8F\xD5\xA5\x17\x83\x00\xBD\x40\xB1\xEE\x44\xF4\xEB\x28\x5B\x96\xA6\xC1\x94\xD3\xB6\x4B\xAE\xF4\x72\xF6\xEC\xAC\xD4\x52\x9E\xC7\x7A\xA8\x4B\x3D\x1D\xBC\xC0\x57\x7B\x91\x62\xEE\x4D\x67\xF3\xBA\x8D\xBB\x6D\xE7\x48\x5E\xBE\x16\x48\x85\x6C\x52\x48\x00\xFF\x06\x95\xE1\x7E\xD9\x13\x98\xE0\x6D\x96\x13\xB7\x4B\x28\x3B\xAC\xC5\x0A\x37\x85\xBB\x6E\xE5\xE9\x2F\x2C\x0E\x9E\xB7\x44\xE7\x85\xF2\x5B\xFD\xEE\x8B\xC2\xB8\x30\xE0\x81\x29\x94\xDB\x33\xFF\x88\x32\x91\xF9\xCB\x14\xBC\x2D\x91\x26\x13\x4A\xA2\xE2\xD7\xD0\xCA\x9F\x1F\x36\x7A\x12\x7D\x0C\x9A\x0B\xE6\x5C\xE2\xB7\x4D\xE5\x0B\xA4\x3E\x25\xF8\xD9\x8D\x9D\xF4\xE3\x2C\x8A\x9B\x98\xAD\x6B\xF5\x0F\xFB\x7D\xDA\x2A\xFE\x21\x18\x76\x9A\x1A\x55\xFC\x25\xCA\x3E\xF9\xFD\xE4\xB6\x2D\x10\x3E\x58\x79\xD8\x30\xED\xDD\x4B\xB6\x0F\xD5\xD6\xF6\xB4\xB1\x37\x7C\x4E\x29\xE6\xF7\x79\x23\x74\x01\x66\x5F\x02\xEB\xF2\x9F\x51\x02\x39\x31\xAA\x8B\xBC\xDE\x6E\x5A\x6D\xAF\x3A\x84\x23\x34\xF4\x13\x9C\x04\xFD\x7E\x6C\xE7\x22\xCC\xB9\x32\x6B\xD9\xC2\x77\xC2\x7B\xDF\xE9\xB6\x17\x53\xAF\x7B\xA6\x94\xAE\x39\x39\x00\xEF\x75\xE2\x4D\x15\xF6\x45\x1A\xB2\x9F\xD6\x82\x24\x45\xB2\x07\xA7\x00\x3D\x14\x01\x62\x40\xDD\xD2\xB8\xF0\x96\x9B\x07\x0C\x49\xF8\x74\xB2\xBF\xE9\x31\xB3\x2E\x9D\x2F\x30\xC2\xF6\xED\x4C\x56\x42\xD4\x47\x55\x6A\xF4\x39\xC2\x23\x5F\x58\xBD\x2C\x7B\xC5\x4A\xDC\x8A\xAD\x40\xE5\x84\xA0\x65\xB3\x65\x73\x74\x9F\xAB\xBD\xE6\x09\xA2\x24\x65\x8D\xF6\x5B\x5B\x14\x4B\xC0\x6A\x78\xF2\xD6\xF3\x76\x45\xA0\x77\xDD\xAA\xDB\x13\xF9\x9F\x0F\x5A\xA5\xA0\xB9\x28\x48\x95\x24\x03\x2D\x94\x6E\xE1\x05\xF7\x5C\x23\x82\x29\x95\xA1\x7C\xF2\xE3\xB9\x2F\xAC\x29\x11\xEC\x60\xD1\x4C\x5F\xB8\xD2\x1E\x9D\xEC\x76\x1D\xFC\x5F\xC0\xFE\xD1\x50\x33\x0A\x42\xD7\x83\xC9\xF9\x49\x54\xBB\x50\x17\x6C\x6B\x38\xC1\x31\x19\xDB\xFC\xDE\xCE\x17\xAD\xB2\xD1\xDA\x0A\x13\xEE\x2B\xED\x3A\xEA\xEA\x20\x8E\x17\x14\x0B\x88\xEE\xB9\xA5\x02\x1B\xE8\x6C\xF7\xFB\xE4\x18\x72\xE7\x35\x88\xDE\x8E\xB8\x56\xFB\xD9\x8C\xB8\x81\xA7\x39\xAC\xF2\xD2\x39\x0B\xAF\x7F\xB6\xD2\x0E\xA5\xC7\xA0\xB3\xEF\x6F\x4B\xF4\x08\x78\xB2\xA8\x89\xCD\x0E\x0E\x8A\xB1\x8F\x8C\xAC\xE3\x23\x23\xB6\xD1\x6C\x80\xFD\xF5\x4D\x65\x3B\x75\x17\xFC\x81\xA3\x88\x15\x2A\xEE\x19\xE0\xFD\xF5\xF1\xC2\xC3\xDD\xEE\x7A\x08\x12\x25\x72\x75\x42\x77\x8D\x51\x5B\xD6\x31\x61\x88\x21\x73\x86\x2E\xE5\x8E\x0B\x3E\xBE\x61\xB8\xE4\xFD\xFA\x67\xC6\x44\x78\xB2\x31\xD9\x8B\xBF\xA8\x07\x8F\x7E\xBE\x46\x54\x53\x24\x9A\x25\xE5\xD3\x5F\xC0\x22\x20\xEA\xC0\x86\xCD\x6C\xF8\x7A\x4A\x6C\x18\xBD\x0F\xCC\xF3\x5F\x7F\xE0\xBE\xB0\x53\x94\x5F\xE0\x89\x11\x86\x92\xF2\x3F\x1A\xBD\xE8\x68\xB8\x35\x3B\x91\x8F\x85\x73\x98\xB9\x7E\xD1\xC0\xAD\xF8\x4D\x72\x04\x4F\x1D\xAD\x82\x5F\x86\xDD\x89\x17\x73\x38\xF8\x25\x34\xBA\x57\x24\xF8\xF3\xE3\x50\xAE\x41\xD9\x91\xF8\xAC\x8E\xC4\x87\xF6\x58\xD2\x1C\x31\x9B\xC9\x0E\x28\x56\xC9\x5F\x09\x43\x73\xA0\x79\x13\x58\xF2\x5E\x25\x89\x8F\x17\x58\x9E\xB3\x5E\x30\x6C\x8A\xAB\x81\x43\x27\x6C\x53\x82\x08\x19\xB9\xC0\xFB\xDA\xF4\xDD\xBD\x55\x66\x8D\x71\xFF\x67\x40\x4E\x53\xB3\x70\x22\x7B\x80\x20\x8C\x92\x3F\x0F\x73\xAB\xF1\xE4\x5A\xA2\x57\x3D\xDF\xDE\x39\xD0\xE5\x47\x1C\x41\xDA\x7A\x95\x0C\x5E\xE4\xA3\x84\x34\x6E\x3E\xA4\x9A\xFD\x22\x46\xA9\x79\x65\x69\x19\x6A\xCE\x8A\xE9\x58\x94\x4A\xE1\xD9\x71\x02\xD9\x8F\x46\xA6\x5C\x59\x48\x1F\x63\x97\x1F\xAF\xFC\x11\xF0\x08\x02\x11\x02\xFF\x70\xA4\xE7\x3A\xB9\x5C\xF1\x70\xCA\x58\xF3\x1A\x00\x14\xFA\x7C\xBF\x7E\x1B\xDE\x7E\xD6\x4F\x58\x40\xFB\x8F\xEA\xDC\x8B\xEC\xE2\x2A\xDD\x39\x97\x04\xBE\x3D\x8E\x0C\xAD\x9B\x48\xEF\x92\x5F\x76\xE3\x0C\x0D\x40\x20\x08\x4A\x46\xE7\x65\x38\xF1\xB4\x43\xE6\x99\x06\x5D\xD5\x4D\x7B\xDF\xD6\x46\x7A\x92\x55\x56\x08\xE4\x5F\x08\xD8\xC5\x94\xA6\x5E\xFE\x3B\xEC\xA3\xE8\x54\x90\x2B\xF7\xF3\x37\x25\x90\x26\x0A\x1C\x78\xE6\xE5\x8D\xFF\x53\x96\x4B\xBB\xE4\xDE\x46\x05\x68\x7C\xBF\x05\x19\xD4\xD2\xC6\x8E\xAE\xE9\x45\x31\x60\xF8\x4C\xD1\x9A\xF1\xCA\x6E\x6E\x61\x33\xD0\x57\x15\x0E\x15\x6A\x14\x06\x1D\xCE\x65\xCA\x45\x71\xA7\xBB\x7A\xDE\xCE\xF6\xEA\x62\xA6\xFA\x54\xC1\xAE\xB4\x77\x26\x07\xC0\x10\x30\xB1\xCC\x24\xBF\xE8\x45\xC2\xA9\xD3\x4B\x66\xA1\xE3\xF0\x57\xB0\xFE"),
-                new TestVector(0x1000000, 0x000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno")
+                new TestVector(0x0000001, ""),
+                new TestVector(0x0000001, "abc"),
+                new TestVector(0x0000001, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
+                new TestVector(0x0000001, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
+                new TestVector(0x0000001, "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern"),
+                new TestVector(0x0000001, "Frank jagt im komplett verwahrlosten Taxi quer durch Bayern"),
+                new TestVector(0x0000001, "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.\nAt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.\nConsetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo."),
+                new TestVector(0x0000001, "\x92\xAD\xAC\x49\x7F\xFA\xB3\x0B\x40\xAC\x67\x4F\x9D\x53\xA9\xA6\x24\xB2\x47\xFA\x23\x72\x94\xFA\x75\x88\x41\xA8\x5F\x4D\xDE\xFD\xDB\xFD\x23\x71\xC1\xE2\xCA\xF8\x5B\x0E\x06\x4B\xBC\x4F\x3A\xC0\xA9\xC6\xFD\x6C\x18\x5D\xC4\xB1\x2C\x8A\xAC\xC3\xE6\x25\xBD\xE8\x7A\xDF\xCB\xFF\x60\x1B\xF0\x66\xDF\x08\x7C\x0A\x63\xCE\x2C\x11\xD6\x64\x8D\x1E\xD0\x57\xCE\x1B\x5D\x93\xC6\xCB\x6F\x33\x19\x81\xB9\xFC\xB5\xBC\xF4\xFB\x6F\x77\x50\x54\x06\xD7\x1A\x87\xEC\x7E\xC1\x99\x55\x97\xFB\xB7\x96\x9D\xEC\x0D\xAD\x01\x93\x9E\x88\x89\xF5\x30\x96\x3F\xE9\x2E\x23\xA8\xF5\xDA\xE5\x47\x3E\x2C\x1E\x22\x38\x2A\xD4\xF7\x0E\xA2\xE4\x5E\xBB\xCB\xAD\x11\xC8\x7A\x74\x8F\x78\xCB\x56\x77\x8E\xF4\x1C\x0A\xEC\xA5\x63\x2E\x75\xE3\x52\xB2\xEA\xB5\x53\x3C\x06\xF7\xC6\x80\x8E\x77\xD0\x0B\x2D\xB5\xF9\x64\xF5\x9F\x89\x83\xD9\x25\x79\x22\x26\xE2\xF3\xE6\xD4\xB0\xFD\xE7\xBA\x74\x6C\x59\xBA\x9A\x20\x21\x2C\x25\xDA\x02\xD2\x3A\xEE\x5F\x88\x5A\x75\xF1\x1A\xC5\xBD\xD5\xCC\x6F\x9C\x4B\x72\xBC\x47\xD8\x40\x89\x72\x00\xF1\xB7\xEF\x97\x7F\x23\x52\x2C\x83\x38\xA3\xFC\xFD\xD7\x72\xC6\x15\xD3\x4A\x93\x46\xBC\xB1\xCE\x37\x14\xFC\x0E\x2B\xCB\x99\xC7\x34\x4D\xAC\xD8\x48\xA1\xEE\x58\x43\x6D\xB4\x78\xD0\x30\xE4\x09\xF1\x7B\x3A\xE9\x60\x68\xD9\x06\xF8\x59\x22\x6A\x66\x47\xD6\x09\x8A\x95\x18\x3B\x01\x46\x0D\x29\x36\x7B\xA5\x22\xB4\x05\x7E\x30\xAC\x8B\xC2\xD5\x4C\xBB\x63\x50\x0B\x76\xA1\x36\xEB\x36\xA0\x77\xD8\xF7\x98\x14\x57\x91\x0E\x8D\x9C\x42\x95\xE9\x39\x42\x01\xC9\xB8\xDF\x82\x87\xFF\xE5\xE6\x66\x80\x0B\x19\xB4\x13\xAC\xEC\x71\x2A\x5D\x35\xC5\xCA\x0F\x56\xE6\xA3\x51\x70\x58\x21\xB2\x20\x8D\xC9\xDE\xCC\x25\x19\xD5\xCF\xA1\xB9\x2B\x68\xBE\xD2\x64\x32\x94\x9B\x02\x7C\xF2\x00\xFE\x3D\x8B\x40\xA2\x19\x50\x0F\xEE\x41\x61\x23\xA8\xC5\xA3\xF5\xFC\x37\x35\x1E\x6A\x51\x42\xAA\x33\x8D\x34\x11\xF8\xB3\xBD\x2B\x74\x99\x16\xFF\xAD\x26\x8F\x00\xC5\xF5\x1C\x59\x22\x02\x3E\xB1\x71\x08\x43\xBF\xA7\x6B\xCD\x03\x33\x0E\x53\x9D\xBA\xE5\x28\xCA\x09\xE6\x1B\xAE\x11\x76\xA9\x7A\x89\xDF\x48\xDC\x85\xF1\x9A\xED\x9F\xE1\x9F\x2D\xB7\xDA\x21\xBA\xD1\x0C\xCA\x67\x05\x5B\xCC\x24\x5B\xEA\xF0\xB8\x6C\xC4\xB8"),
+                new TestVector(0x0000001, "\x05\x85\x7B\xAA\xC0\xC9\xE8\x62\x60\x62\xB0\xA0\x22\x03\x88\xA6\x84\x43\xAA\x8C\x77\x0C\x82\x94\x5D\x35\x82\x98\x04\x1C\xDD\xA8\xD4\x4E\x90\x6F\x6D\xB9\x81\xE2\x7B\x3F\x95\x74\x24\x3E\x9F\x53\x7B\xEF\x0A\x25\x47\x79\x89\x5C\xB6\xB2\x37\xFC\x4F\x74\x6F\x7F\xCD\xE3\x73\x8B\xF5\xD1\xA2\x3C\xBC\x70\xF1\x41\x84\xF2\xEB\x37\x9B\xCB\xC3\xD7\x46\x2E\x52\xC3\x97\x3A\xB6\x74\xF3\xD5\xBB\x5A\x89\x36\xF3\x1D\xD5\xA1\x0E\xF1\x8E\xF4\x17\x26\xCE\x66\x00\x28\xDE\x17\x3D\x5B\x3B\x83\x7B\xD3\xAB\xC4\xA1\xEF\x8A\x59\xA2\xE2\xBA\x6E\x13\xEE\xEA\x83\x6B\xC1\xB1\x17\x9C\x65\x1A\xBE\x45\xA7\xB2\x40\x91\x99\x07\x9F\x4B\x5F\xBE\xF8\xC6\x7E\x4E\x0A\xFF\x5B\xB5\x5A\x7C\x2F\x9E\x77\xEE\x3B\xE0\xB5\x62\x80\x22\x9D\x2D\x13\xCB\xBC\x33\x80\xDD\xAB\x15\xAA\xAD\x04\x3A\xAD\x8C\xD5\x32\x4D\x30\x32\xF0\x71\x47\x27\x5E\x4B\x12\xFB\xEF\x7B\xAB\x83\xAC\x9D\xCD\xED\xEE\x2C\x25\x69\x19\x6D\x60\xEF\x18\xB5\xA0\x80\x9D\xA2\x83\x31\x87\x07\x53\x52\xE1\x5B\x4C\x1E\xFF\x41\x61\x34\x1C\x3E\x1F\x5F\xA2\x58\xD7\x67\x56\x23\xB6\xEC\xF5\xBC\x27\xCE\xCD\xB4\xB2\x57\xB1\x3B\xEB\xA6\x58\x95\xE0\xB5\xE8\xB1\x9E\x18\x3F\x4B\x60\x96\x4E\xFB\x59\x25\x06\xF4\x95\x83\x80\x98\x5D\x9F\x59\x9B\x83\x26\x97\x89\xCE\xAC\xBB\xD0\x5C\x95\x37\xDC\xE4\xDD\x2F\x5C\x22\x9C\x65\x10\xFB\x61\xA1\x73\xA1\x6A\x89\x61\x93\x7C\xC8\x6E\x80\xB8\x48\x57\x48\x4F\x88\x7E\x6A\xCE\x90\xF3\xEB\xB3\x9F\x50\xF0\x0F\xB6\x29\x60\x28\xE5\x8B\xDF\xEA\xCA\xFB\x3C\xDD\xAA\x60\x60\x73\xB3\xAE\x45\x4F\xC9\x1D\xB2\x63\x31\x30\x3B\x85\xBA\x8A\x37\x41\xD6\x5A\x52\x11\xA2\x2A\x11\x39\xD2\x1E\x2D\xBF\x1A\x53\x8A\x13\x24\xC7\xA3\xDE\xBE\x0B\x23\x72\xCC\x92\x29\xB8\x2B\x92\x8F\x08\x0A\xB4\xA6\x47\x76\x29\x39\xBF\x40\xBC\x59\x9F\xCD\x9D\xCF\x35\x51\x16\xF5\x44\x40\xA4\xC3\x1D\xA8\x8C\x73\xC0\xA1\x12\x84\x15\x4D\xB1\x7B\x4A\x44\xF4\x12\x8E\x0F\xE4\x4C\x7E\x5C\xB2\x92\x5F\xA9\xB3\x71\xDA\x40\x50\x78\xC7\x02\x1F\x20\x79\x84\xF3\x91\x1F\x47\x47\x40\x67\x2B\x52\xA1\x67\x91\x05\xCA\xB4\xAB\xA8\x69\x40\xFD\x7F\x28\xF6\x17\xB0\xDD\x1A\x82\x0F\x20\x5D\xD2\x39\xA8\x9A\x73\xF1\xAC\x10\x18\x3C\x69\x99\x49\xB8\xB2\x90\x24\xB5\x2E\x0C\x57\x93\x6A\x1B\x0B\x9C\xB9\xF5\x45\x71\xDD\xAF\x94\x6F\xA5\xF5\xCF\xB1\xBC\x1C\x0E\x5E\x5A\x0E\xF6\x9D\x9E\x71\x11\x99\x9F\xA4\x57\xE6\x6D\xD5\x83\x00\xD7\x85\x0C\x54\x01\xD4\x49\x1C\xF6\x8C\x8E\x00\x8B\xF8\x48\x50\x4D\x6F\xF1\xEA\xEF\x2D\x64\xD4\xF5\x00\xA9\x03\xE6\xCB\x5F\xCF\x6C\xD6\x26\xC1\xF4\x97\xCF\xB5\x16\xA1\x62\xDE\xFF\xC2\x00\xD0\x9A\x5E\xBB\xB4\x76\x86\xFD\x4B\xF2\x29\x4F\x0F\x69\x15\x7D\xAC\xAA\x2B\xD1\xBA\x6E\xA2\x1A\xC1\x6B\x9A\x14\x90\x63\xBD\xC4\x31\x36\xBB\x26\xA7\x69\x7D\x11\x76\xE5\x3F\x05\xC5\x4F\x6D\xB0\x12\x2E\xBC\x72\x18\x8A\x0F\x07\xA1\x2A\xD0\xC0\xDE\x2B\x63\x19\x6E\xA8\x7F\xC7\x9D\x47\x2F\xA6\x62\xA3\x57\xF0\x37\x58\x9F\x80\x4D\x9D\xA9\x2F\x2A\x39\x79\x16\x6A\xCA\xDF\x22\x8F\x2F\xAA\xA2\x72\x75\x96\x63\x19\xE2\xDF\x7E\x37\x1D\x68\xF8\xD9\x5D\x8D\x40\x23\x7F\xF5\x1B\x40\x33\xCB\x38\x81\x4F\x4A\x5E\x25\x3C\xF0\x19\xD7\x01\xD1\x21\xF6\xC5\x6F\xDA\x17\x83\x60\x39\x25\x66\xF2\x25\x31\x58\xA6\xA4\xAD\x46\x78\xE7\x76\x57\x19\xCB\x7C\x9C\x6D\xE0\x6D\xF8\xFD\x28\x14\x14\x0D\xF0\x0C\x8F\xD4\x68\x59\xD2\x96\x15\xBF\xEC\x8A\x34\xF7\x1A\x3B\x2C\x8C\x4A\x98\x16\x37\x7D\x95\x15\xBD\x45\xCB\xF8\xC1\xA1\x9E\x64\x3A\x17\x4C\xC4\xD2\xD1\xA0\xA4\xBD\x5A\x79\xCB\x53\xBC\x37\x84\xC8\x4F\x9B\xD7\x10\x42\x3D\x26\x40\xD6\xF2\x50\x20\x17\x8C\x2A\x81\x3A\xB5\xD2\x8B\x66\xE5\x9F\xCB\xEB\x29\xC8\x41\xD1\xB1\x9F\xBA\x77\x2A\x18\xD7\x7F\x8D\x46\x60\xFE\xDB\xE4\xC1\xA5\x73\xDD\x88\x7B\x17\xAA\x3D\x58\x30\x9B\xF6\xB2\x66\x4E\xAC\xC3\xE3\xA4\x7A\xAE\xDF\x33\xBE\x52\x89\xB7\xF9\xB0\x18\xFB\x70\x63\x9A\xC2\xB5\xFD\xEF\x3C\x8E\x91\x69\x5F\xA8\xE0\xF6\x83\x25\xEF\x16\xAA\xAF\x27\xB5\xD5\x2C\x58\x57\x35\x67\x5D\x11\x31\xA3\x25\x39\x0D\x5C\xF1\xAC\xD4\xFB\x03\x4C\x8A\xC0\xFB\xB2\xE5\x0E\xAD\x7F\xC9\xB1\x33\xAE\xD9\xEE\x3D\x71\xCB\x23\x54\xF9\x7F\xBF\x02\x4D\xE1\xD2\xBC\x66\xA9\x5C\x9D\x36\x47\x5A\x62\x76\xEF\xC5\xC8\x30\xBC\x78\x79\x92\x62\xA8\xE9\x0B\x83\xE5\x91\x42\x8F\xFC\xE9\xA8\x6C\xAB\xA9\x75\xA1\x9B\x6B\xA2\xE5\x87\x96\xBE\x16\x84\x0A\x04\x29\x9F\x2E\x2D\xC9\xC8\xDA\xEA\xF6\x9A\x25\x0F\xF8\xC0\xFD\xB5\xD7\x82"),
+                new TestVector(0x0000001, "\xFF\xD3\xB0\xA7\x2D\x6F\x68\x3A\x0B\x80\x75\xAA\xE0\xE7\x1E\x77\x32\x81\x7D\x74\x65\xEE\x85\xB5\x7A\xD8\xD6\x53\xCE\x9F\x4F\xB7\xBD\xD4\xB0\xB6\x7B\x44\xA5\x2C\x2E\x69\xC9\x60\xE3\xAE\xC7\xAD\x66\x04\xDC\x1D\xB1\xAE\xB2\xAE\x5E\xF0\x78\xCB\x08\xFF\x40\x1C\x36\x34\x0C\x10\xE3\x41\x9B\x80\x8F\x62\xBF\xD6\x25\xB7\x2D\x74\x83\x4F\x24\x7E\xBA\xB7\x0D\x87\x9A\x5C\x72\xE6\xF0\x09\x79\x51\x2B\x1F\xE6\x4A\xC0\x22\x17\x58\x66\xE9\x8B\xB2\x92\xE3\x62\xFC\x73\x6E\xBC\x72\xD5\xCF\x08\x05\x4B\xB6\x14\x3C\x91\x33\x3E\x60\xBA\x81\xC3\xFD\x32\xA9\xB7\x64\xD8\x1F\x9B\x44\x63\x2D\x1A\x70\xE1\xF5\x4E\xA0\x8D\x3C\x20\x8C\x46\x59\xF5\xF4\xE2\xE6\xA2\xA7\xE8\x18\xCB\x4D\xDB\x5A\xC6\x90\x93\xAC\xDF\x6A\xFF\xD1\x00\x96\x4F\xFC\xEF\xB7\x6A\xEB\xBB\x87\x30\x4F\xFC\x19\xCE\x12\x33\xC1\x13\xDE\xDF\xA3\x7B\x89\xC2\xA3\xDC\xA4\xA9\xBD\x04\x10\x96\xEE\xB8\x77\xFA\x98\x5C\x42\x01\xF3\xF5\xD4\xEF\x18\x0E\xB4\x0F\x2E\x2C\xFC\x9A\xD0\xCF\x4C\x99\xE1\x20\xF0\x65\x5B\xFE\xAF\xF0\x9B\xB5\xDF\xD5\x2B\xC2\x3D\xB0\xFD\xE8\x31\x3C\x7F\xA6\x65\x6F\xBA\x0E\xD9\xC9\x8D\x5B\xD1\xEA\x7C\x7F\x4B\x52\xED\x80\x4F\x26\x17\x95\x91\x6B\xB8\x08\x2C\x1E\x62\x4F\xD2\xD0\x7A\x00\x75\xA6\x13\x29\x93\xCB\xC4\xC5\xA7\x9E\x90\xB1\x7C\x8C\x1C\x7A\x59\x6C\x1D\x5D\xFC\x46\xAF\x0C\x96\xBA\x31\x95\x44\x7B\xCB\x5E\xAB\x64\x42\xF7\x35\x7A\x1F\x87\xF2\xB3\x3E\x42\x33\x28\xCF\x52\x47\x47\x13\x9A\xA3\x63\xD1\xBD\x7A\xF0\x0C\x90\x68\x1D\x0C\x03\x83\xA9\x8E\x9D\x7A\x5C\x6A\x1E\x66\xA9\xF1\x2B\xB8\xCE\xA2\xD2\x2B\x17\x21\xB1\x83\x87\xFC\xF1\xF3\x46\x78\xDC\xD3\x96\x66\xC2\xB4\xD3\x83\x02\xA8\xD7\xA5\x95\xDF\x30\x04\xF2\xD1\x52\x8C\x5A\x44\x62\x68\xBC\xCD\xA7\x69\xCB\x4E\xB4\x5B\x10\x83\x59\xAC\x28\x29\x13\x04\xC3\xB2\x7A\xC5\x35\xA7\xB0\x0A\xD4\xF0\xF0\xEC\xB4\xC0\xF2\xD2\xC2\x2B\x88\x03\xD5\xE6\x4E\x6F\xEF\xAD\x7D\xD8\x0F\xF0\x6C\xB0\xB1\x09\xD8\x9D\x99\x14\xE3\x00\x05\x23\xC7\x15\xB9\xB1\xB7\xF1\xEE\x9F\xCE\x04\x39\xB7\xE2\x4D\x0C\x5A\x13\x7A\x72\x08\x21\x11\x28\xB2\x35\xEC\x7A\xE5\x23\xD5\x66\xD6\x4C\x7A\x82\xFD\x6E\x1F\x3A\x01\xDC\x38\x3A\x21\x7B\x23\xB5\xFA\xCC\x05\x65\x8D\xDC\xDA\x5C\xA7\x0A\x1A\xA0\x02\xF4\xB6\xA0\x32\x34\x77\xC5\xE2\xBB\x10\x46\xCE\x57\xE3\xA9\x0B\x65\x73\x8F\xD5\xA5\x17\x83\x00\xBD\x40\xB1\xEE\x44\xF4\xEB\x28\x5B\x96\xA6\xC1\x94\xD3\xB6\x4B\xAE\xF4\x72\xF6\xEC\xAC\xD4\x52\x9E\xC7\x7A\xA8\x4B\x3D\x1D\xBC\xC0\x57\x7B\x91\x62\xEE\x4D\x67\xF3\xBA\x8D\xBB\x6D\xE7\x48\x5E\xBE\x16\x48\x85\x6C\x52\x48\x00\xFF\x06\x95\xE1\x7E\xD9\x13\x98\xE0\x6D\x96\x13\xB7\x4B\x28\x3B\xAC\xC5\x0A\x37\x85\xBB\x6E\xE5\xE9\x2F\x2C\x0E\x9E\xB7\x44\xE7\x85\xF2\x5B\xFD\xEE\x8B\xC2\xB8\x30\xE0\x81\x29\x94\xDB\x33\xFF\x88\x32\x91\xF9\xCB\x14\xBC\x2D\x91\x26\x13\x4A\xA2\xE2\xD7\xD0\xCA\x9F\x1F\x36\x7A\x12\x7D\x0C\x9A\x0B\xE6\x5C\xE2\xB7\x4D\xE5\x0B\xA4\x3E\x25\xF8\xD9\x8D\x9D\xF4\xE3\x2C\x8A\x9B\x98\xAD\x6B\xF5\x0F\xFB\x7D\xDA\x2A\xFE\x21\x18\x76\x9A\x1A\x55\xFC\x25\xCA\x3E\xF9\xFD\xE4\xB6\x2D\x10\x3E\x58\x79\xD8\x30\xED\xDD\x4B\xB6\x0F\xD5\xD6\xF6\xB4\xB1\x37\x7C\x4E\x29\xE6\xF7\x79\x23\x74\x01\x66\x5F\x02\xEB\xF2\x9F\x51\x02\x39\x31\xAA\x8B\xBC\xDE\x6E\x5A\x6D\xAF\x3A\x84\x23\x34\xF4\x13\x9C\x04\xFD\x7E\x6C\xE7\x22\xCC\xB9\x32\x6B\xD9\xC2\x77\xC2\x7B\xDF\xE9\xB6\x17\x53\xAF\x7B\xA6\x94\xAE\x39\x39\x00\xEF\x75\xE2\x4D\x15\xF6\x45\x1A\xB2\x9F\xD6\x82\x24\x45\xB2\x07\xA7\x00\x3D\x14\x01\x62\x40\xDD\xD2\xB8\xF0\x96\x9B\x07\x0C\x49\xF8\x74\xB2\xBF\xE9\x31\xB3\x2E\x9D\x2F\x30\xC2\xF6\xED\x4C\x56\x42\xD4\x47\x55\x6A\xF4\x39\xC2\x23\x5F\x58\xBD\x2C\x7B\xC5\x4A\xDC\x8A\xAD\x40\xE5\x84\xA0\x65\xB3\x65\x73\x74\x9F\xAB\xBD\xE6\x09\xA2\x24\x65\x8D\xF6\x5B\x5B\x14\x4B\xC0\x6A\x78\xF2\xD6\xF3\x76\x45\xA0\x77\xDD\xAA\xDB\x13\xF9\x9F\x0F\x5A\xA5\xA0\xB9\x28\x48\x95\x24\x03\x2D\x94\x6E\xE1\x05\xF7\x5C\x23\x82\x29\x95\xA1\x7C\xF2\xE3\xB9\x2F\xAC\x29\x11\xEC\x60\xD1\x4C\x5F\xB8\xD2\x1E\x9D\xEC\x76\x1D\xFC\x5F\xC0\xFE\xD1\x50\x33\x0A\x42\xD7\x83\xC9\xF9\x49\x54\xBB\x50\x17\x6C\x6B\x38\xC1\x31\x19\xDB\xFC\xDE\xCE\x17\xAD\xB2\xD1\xDA\x0A\x13\xEE\x2B\xED\x3A\xEA\xEA\x20\x8E\x17\x14\x0B\x88\xEE\xB9\xA5\x02\x1B\xE8\x6C\xF7\xFB\xE4\x18\x72\xE7\x35\x88\xDE\x8E\xB8\x56\xFB\xD9\x8C\xB8\x81\xA7\x39\xAC\xF2\xD2\x39\x0B\xAF\x7F\xB6\xD2\x0E\xA5\xC7\xA0\xB3\xEF\x6F\x4B\xF4\x08\x78\xB2\xA8\x89\xCD\x0E\x0E\x8A\xB1\x8F\x8C\xAC\xE3\x23\x23\xB6\xD1\x6C\x80\xFD\xF5\x4D\x65\x3B\x75\x17\xFC\x81\xA3\x88\x15\x2A\xEE\x19\xE0\xFD\xF5\xF1\xC2\xC3\xDD\xEE\x7A\x08\x12\x25\x72\x75\x42\x77\x8D\x51\x5B\xD6\x31\x61\x88\x21\x73\x86\x2E\xE5\x8E\x0B\x3E\xBE\x61\xB8\xE4\xFD\xFA\x67\xC6\x44\x78\xB2\x31\xD9\x8B\xBF\xA8\x07\x8F\x7E\xBE\x46\x54\x53\x24\x9A\x25\xE5\xD3\x5F\xC0\x22\x20\xEA\xC0\x86\xCD\x6C\xF8\x7A\x4A\x6C\x18\xBD\x0F\xCC\xF3\x5F\x7F\xE0\xBE\xB0\x53\x94\x5F\xE0\x89\x11\x86\x92\xF2\x3F\x1A\xBD\xE8\x68\xB8\x35\x3B\x91\x8F\x85\x73\x98\xB9\x7E\xD1\xC0\xAD\xF8\x4D\x72\x04\x4F\x1D\xAD\x82\x5F\x86\xDD\x89\x17\x73\x38\xF8\x25\x34\xBA\x57\x24\xF8\xF3\xE3\x50\xAE\x41\xD9\x91\xF8\xAC\x8E\xC4\x87\xF6\x58\xD2\x1C\x31\x9B\xC9\x0E\x28\x56\xC9\x5F\x09\x43\x73\xA0\x79\x13\x58\xF2\x5E\x25\x89\x8F\x17\x58\x9E\xB3\x5E\x30\x6C\x8A\xAB\x81\x43\x27\x6C\x53\x82\x08\x19\xB9\xC0\xFB\xDA\xF4\xDD\xBD\x55\x66\x8D\x71\xFF\x67\x40\x4E\x53\xB3\x70\x22\x7B\x80\x20\x8C\x92\x3F\x0F\x73\xAB\xF1\xE4\x5A\xA2\x57\x3D\xDF\xDE\x39\xD0\xE5\x47\x1C\x41\xDA\x7A\x95\x0C\x5E\xE4\xA3\x84\x34\x6E\x3E\xA4\x9A\xFD\x22\x46\xA9\x79\x65\x69\x19\x6A\xCE\x8A\xE9\x58\x94\x4A\xE1\xD9\x71\x02\xD9\x8F\x46\xA6\x5C\x59\x48\x1F\x63\x97\x1F\xAF\xFC\x11\xF0\x08\x02\x11\x02\xFF\x70\xA4\xE7\x3A\xB9\x5C\xF1\x70\xCA\x58\xF3\x1A\x00\x14\xFA\x7C\xBF\x7E\x1B\xDE\x7E\xD6\x4F\x58\x40\xFB\x8F\xEA\xDC\x8B\xEC\xE2\x2A\xDD\x39\x97\x04\xBE\x3D\x8E\x0C\xAD\x9B\x48\xEF\x92\x5F\x76\xE3\x0C\x0D\x40\x20\x08\x4A\x46\xE7\x65\x38\xF1\xB4\x43\xE6\x99\x06\x5D\xD5\x4D\x7B\xDF\xD6\x46\x7A\x92\x55\x56\x08\xE4\x5F\x08\xD8\xC5\x94\xA6\x5E\xFE\x3B\xEC\xA3\xE8\x54\x90\x2B\xF7\xF3\x37\x25\x90\x26\x0A\x1C\x78\xE6\xE5\x8D\xFF\x53\x96\x4B\xBB\xE4\xDE\x46\x05\x68\x7C\xBF\x05\x19\xD4\xD2\xC6\x8E\xAE\xE9\x45\x31\x60\xF8\x4C\xD1\x9A\xF1\xCA\x6E\x6E\x61\x33\xD0\x57\x15\x0E\x15\x6A\x14\x06\x1D\xCE\x65\xCA\x45\x71\xA7\xBB\x7A\xDE\xCE\xF6\xEA\x62\xA6\xFA\x54\xC1\xAE\xB4\x77\x26\x07\xC0\x10\x30\xB1\xCC\x24\xBF\xE8\x45\xC2\xA9\xD3\x4B\x66\xA1\xE3\xF0\x57\xB0\xFE"),
+                new TestVector(0x1000000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno")
             );
 
             ConstArray<ConstArray<byte>> TEST_RESULT = new ConstArray<ConstArray<byte>>(
-                new ConstArray<byte>(0x86, 0x03, 0x84, 0x37, 0xA0, 0x03, 0x00, 0x40, 0xC1, 0xC9, 0xC1, 0x6B, 0x9D, 0xE2, 0x8D, 0x82, 0x1D, 0x94, 0x59, 0x3C, 0xB7, 0xDD, 0xA8, 0xB1, 0x56, 0xFF, 0x9A, 0xE3, 0x34, 0x26, 0x4C, 0x2E, 0x88, 0x35, 0xB6, 0x00, 0x2D, 0x96, 0x65, 0x7A, 0x37, 0x30, 0x41, 0x9F, 0x5E, 0x43, 0xF2, 0x02),
-                new ConstArray<byte>(0x11, 0x53, 0x49, 0x9D, 0xA6, 0xB3, 0x58, 0x7A, 0xC0, 0xA8, 0x8A, 0x80, 0x32, 0xE8, 0xCE, 0x16, 0x2F, 0x42, 0xA1, 0x1A, 0x62, 0x5F, 0xFB, 0x11, 0x91, 0x69, 0x27, 0xE4, 0xEC, 0x76, 0x62, 0xA0, 0x8F, 0x55, 0x52, 0x5F, 0x48, 0xEA, 0x03, 0x63, 0x93, 0x56, 0x86, 0xEA, 0x69, 0x02, 0x07, 0xD3),
-                new ConstArray<byte>(0xA4, 0x6A, 0x55, 0x8A, 0xD1, 0x9A, 0xAE, 0xFA, 0x44, 0x6F, 0x33, 0xFC, 0x6D, 0xE1, 0x3C, 0xFE, 0x2D, 0x21, 0x34, 0x51, 0x0A, 0xDE, 0xBB, 0x65, 0xFD, 0x16, 0x8E, 0xFF, 0xB9, 0xCD, 0xFC, 0xF7, 0x35, 0x9A, 0x44, 0x88, 0x25, 0xA0, 0xC8, 0x8D, 0x5F, 0xF2, 0xF2, 0x3F, 0x4F, 0xE8, 0xFA, 0xFB),
-                new ConstArray<byte>(0x64, 0x13, 0xDA, 0x65, 0x91, 0x94, 0xFE, 0xED, 0x3B, 0x5C, 0x16, 0xC8, 0x97, 0xBA, 0xAA, 0x25, 0xD1, 0xF3, 0x6E, 0x0B, 0x72, 0xF1, 0x8E, 0x45, 0xB9, 0xF4, 0xB3, 0xF6, 0xB9, 0xF7, 0xF8, 0xD5, 0xEC, 0x9C, 0x16, 0x9E, 0x85, 0x5D, 0x8B, 0xD1, 0xEF, 0x4B, 0x5C, 0x9C, 0xF8, 0x82, 0x22, 0x4D),
-                new ConstArray<byte>(0xA5, 0x21, 0x92, 0x02, 0xF3, 0x73, 0x23, 0x61, 0x24, 0x70, 0xD5, 0x95, 0x95, 0x54, 0x17, 0xD8, 0x2C, 0xFE, 0x15, 0xBA, 0x81, 0xAC, 0xDB, 0xA5, 0x14, 0x1D, 0xED, 0x04, 0x07, 0xBF, 0x27, 0x12, 0xF4, 0x3E, 0x0E, 0xD1, 0x05, 0x1D, 0x79, 0xD2, 0x5B, 0x2D, 0xCE, 0x83, 0xE9, 0xD6, 0x16, 0xB3),
-                new ConstArray<byte>(0xC8, 0x14, 0x7F, 0x57, 0x3E, 0x02, 0xC2, 0x73, 0x08, 0x7E, 0x01, 0x1C, 0xB1, 0x58, 0xB5, 0xF3, 0xD9, 0xE8, 0xCB, 0x9C, 0x74, 0x79, 0x79, 0x18, 0x7E, 0x3A, 0xFB, 0x6A, 0xAB, 0x9F, 0x9C, 0xE9, 0x56, 0x07, 0xA6, 0x27, 0xA2, 0x5C, 0x88, 0x99, 0x11, 0xAB, 0xFA, 0x1D, 0x20, 0x25, 0xFD, 0x07),
-                new ConstArray<byte>(0x0F, 0xE9, 0x8E, 0xB3, 0x4A, 0xB7, 0xBD, 0x2F, 0xB1, 0xE2, 0x79, 0xE3, 0xB9, 0x9E, 0xCD, 0x36, 0x72, 0xCD, 0x0A, 0xB6, 0x3F, 0x6C, 0x5B, 0x74, 0xEA, 0xB8, 0x8E, 0x07, 0xE6, 0x4C, 0xA6, 0x27, 0xF7, 0xDC, 0xE7, 0x22, 0xE0, 0xD9, 0xB6, 0x60, 0x1B, 0x6B, 0x5E, 0x03, 0x43, 0xD1, 0x30, 0x4A),
-                new ConstArray<byte>(0xC3, 0xA0, 0x56, 0x86, 0xC7, 0x5B, 0x02, 0xB4, 0x42, 0x38, 0x14, 0xBC, 0x05, 0x1A, 0x11, 0x54, 0x62, 0x15, 0x35, 0xA8, 0x8B, 0xE1, 0xD3, 0x00, 0x31, 0x97, 0x1C, 0x8B, 0xA4, 0xF5, 0x5E, 0x4E, 0xEF, 0x94, 0x10, 0x57, 0xAD, 0x9C, 0x7E, 0x63, 0x2C, 0xAA, 0xA3, 0xE0, 0x17, 0xBC, 0xFE, 0x97),
-                new ConstArray<byte>(0x68, 0xC5, 0x2F, 0xC2, 0x33, 0x20, 0x0E, 0xCD, 0x43, 0xA1, 0x93, 0xC1, 0xFD, 0x27, 0x65, 0x1F, 0x0F, 0x70, 0x89, 0x06, 0x3B, 0x4A, 0x07, 0x4C, 0x1A, 0x5C, 0x24, 0x0A, 0x66, 0xBA, 0x78, 0xF3, 0xE6, 0x9F, 0x5A, 0x9E, 0x59, 0x72, 0x17, 0x4F, 0x52, 0x17, 0x28, 0x61, 0xB1, 0x0A, 0x29, 0x35),
-                new ConstArray<byte>(0x38, 0x13, 0x5B, 0x1F, 0x4C, 0x5A, 0x2B, 0xEA, 0xC0, 0xE5, 0xF7, 0x11, 0x80, 0xA7, 0xF7, 0xFA, 0x03, 0xC7, 0xE6, 0xF7, 0xF1, 0x41, 0xB4, 0x3A, 0x15, 0xDA, 0x26, 0x10, 0x56, 0xD9, 0xBB, 0x7B, 0x2A, 0xD6, 0xBA, 0x1B, 0x05, 0xDD, 0x38, 0x88, 0xE6, 0x4B, 0xA8, 0xB0, 0x99, 0xF5, 0x57, 0x68),
-                new ConstArray<byte>(0x33, 0x65, 0x81, 0x1C, 0x97, 0x0B, 0xB9, 0x55, 0x53, 0x00, 0xDA, 0x42, 0x6B, 0x37, 0x20, 0xFA, 0x69, 0x5C, 0xC4, 0xB7, 0xE7, 0x3C, 0xC9, 0x5A, 0x37, 0x35, 0xB1, 0x09, 0x9A, 0xC4, 0x26, 0x3B, 0x74, 0xFA, 0x51, 0xB5, 0x19, 0xD3, 0x8F, 0xED, 0x03, 0x94, 0xA1, 0x3C, 0x1F, 0xD2, 0x46, 0xE1)
+                new ConstArray<byte>(0x86,0x03,0x84,0x37,0xA0,0x03,0x00,0x40,0xC1,0xC9,0xC1,0x6B,0x9D,0xE2,0x8D,0x82,0x1D,0x94,0x59,0x3C,0xB7,0xDD,0xA8,0xB1,0x56,0xFF,0x9A,0xE3,0x34,0x26,0x4C,0x2E,0x88,0x35,0xB6,0x00,0x2D,0x96,0x65,0x7A,0x37,0x30,0x41,0x9F,0x5E,0x43,0xF2,0x02),
+                new ConstArray<byte>(0x11,0x53,0x49,0x9D,0xA6,0xB3,0x58,0x7A,0xC0,0xA8,0x8A,0x80,0x32,0xE8,0xCE,0x16,0x2F,0x42,0xA1,0x1A,0x62,0x5F,0xFB,0x11,0x91,0x69,0x27,0xE4,0xEC,0x76,0x62,0xA0,0x8F,0x55,0x52,0x5F,0x48,0xEA,0x03,0x63,0x93,0x56,0x86,0xEA,0x69,0x02,0x07,0xD3),
+                new ConstArray<byte>(0xA4,0x6A,0x55,0x8A,0xD1,0x9A,0xAE,0xFA,0x44,0x6F,0x33,0xFC,0x6D,0xE1,0x3C,0xFE,0x2D,0x21,0x34,0x51,0x0A,0xDE,0xBB,0x65,0xFD,0x16,0x8E,0xFF,0xB9,0xCD,0xFC,0xF7,0x35,0x9A,0x44,0x88,0x25,0xA0,0xC8,0x8D,0x5F,0xF2,0xF2,0x3F,0x4F,0xE8,0xFA,0xFB),
+                new ConstArray<byte>(0x64,0x13,0xDA,0x65,0x91,0x94,0xFE,0xED,0x3B,0x5C,0x16,0xC8,0x97,0xBA,0xAA,0x25,0xD1,0xF3,0x6E,0x0B,0x72,0xF1,0x8E,0x45,0xB9,0xF4,0xB3,0xF6,0xB9,0xF7,0xF8,0xD5,0xEC,0x9C,0x16,0x9E,0x85,0x5D,0x8B,0xD1,0xEF,0x4B,0x5C,0x9C,0xF8,0x82,0x22,0x4D),
+                new ConstArray<byte>(0xA5,0x21,0x92,0x02,0xF3,0x73,0x23,0x61,0x24,0x70,0xD5,0x95,0x95,0x54,0x17,0xD8,0x2C,0xFE,0x15,0xBA,0x81,0xAC,0xDB,0xA5,0x14,0x1D,0xED,0x04,0x07,0xBF,0x27,0x12,0xF4,0x3E,0x0E,0xD1,0x05,0x1D,0x79,0xD2,0x5B,0x2D,0xCE,0x83,0xE9,0xD6,0x16,0xB3),
+                new ConstArray<byte>(0xC8,0x14,0x7F,0x57,0x3E,0x02,0xC2,0x73,0x08,0x7E,0x01,0x1C,0xB1,0x58,0xB5,0xF3,0xD9,0xE8,0xCB,0x9C,0x74,0x79,0x79,0x18,0x7E,0x3A,0xFB,0x6A,0xAB,0x9F,0x9C,0xE9,0x56,0x07,0xA6,0x27,0xA2,0x5C,0x88,0x99,0x11,0xAB,0xFA,0x1D,0x20,0x25,0xFD,0x07),
+                new ConstArray<byte>(0x0F,0xE9,0x8E,0xB3,0x4A,0xB7,0xBD,0x2F,0xB1,0xE2,0x79,0xE3,0xB9,0x9E,0xCD,0x36,0x72,0xCD,0x0A,0xB6,0x3F,0x6C,0x5B,0x74,0xEA,0xB8,0x8E,0x07,0xE6,0x4C,0xA6,0x27,0xF7,0xDC,0xE7,0x22,0xE0,0xD9,0xB6,0x60,0x1B,0x6B,0x5E,0x03,0x43,0xD1,0x30,0x4A),
+                new ConstArray<byte>(0xC3,0xA0,0x56,0x86,0xC7,0x5B,0x02,0xB4,0x42,0x38,0x14,0xBC,0x05,0x1A,0x11,0x54,0x62,0x15,0x35,0xA8,0x8B,0xE1,0xD3,0x00,0x31,0x97,0x1C,0x8B,0xA4,0xF5,0x5E,0x4E,0xEF,0x94,0x10,0x57,0xAD,0x9C,0x7E,0x63,0x2C,0xAA,0xA3,0xE0,0x17,0xBC,0xFE,0x97),
+                new ConstArray<byte>(0x68,0xC5,0x2F,0xC2,0x33,0x20,0x0E,0xCD,0x43,0xA1,0x93,0xC1,0xFD,0x27,0x65,0x1F,0x0F,0x70,0x89,0x06,0x3B,0x4A,0x07,0x4C,0x1A,0x5C,0x24,0x0A,0x66,0xBA,0x78,0xF3,0xE6,0x9F,0x5A,0x9E,0x59,0x72,0x17,0x4F,0x52,0x17,0x28,0x61,0xB1,0x0A,0x29,0x35),
+                new ConstArray<byte>(0x38,0x13,0x5B,0x1F,0x4C,0x5A,0x2B,0xEA,0xC0,0xE5,0xF7,0x11,0x80,0xA7,0xF7,0xFA,0x03,0xC7,0xE6,0xF7,0xF1,0x41,0xB4,0x3A,0x15,0xDA,0x26,0x10,0x56,0xD9,0xBB,0x7B,0x2A,0xD6,0xBA,0x1B,0x05,0xDD,0x38,0x88,0xE6,0x4B,0xA8,0xB0,0x99,0xF5,0x57,0x68),
+                new ConstArray<byte>(0x33,0x65,0x81,0x1C,0x97,0x0B,0xB9,0x55,0x53,0x00,0xDA,0x42,0x6B,0x37,0x20,0xFA,0x69,0x5C,0xC4,0xB7,0xE7,0x3C,0xC9,0x5A,0x37,0x35,0xB1,0x09,0x9A,0xC4,0x26,0x3B,0x74,0xFA,0x51,0xB5,0x19,0xD3,0x8F,0xED,0x03,0x94,0xA1,0x3C,0x1F,0xD2,0x46,0xE1)
             );
 
             for (int i = 0; i < TEST_VECTOR.Length; ++i)