New block cipher.
authormdw <mdw>
Sat, 15 Jul 2000 20:51:59 +0000 (20:51 +0000)
committermdw <mdw>
Sat, 15 Jul 2000 20:51:59 +0000 (20:51 +0000)
square.c [new file with mode: 0644]
square.h [new file with mode: 0644]
tests/square [new file with mode: 0644]

diff --git a/square.c b/square.c
new file mode 100644 (file)
index 0000000..5111a3d
--- /dev/null
+++ b/square.c
@@ -0,0 +1,231 @@
+/* -*-c-*-
+ *
+ * $Id: square.c,v 1.1 2000/07/15 20:51:58 mdw Exp $
+ *
+ * The Square block cipher
+ *
+ * (c) 2000 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------* 
+ *
+ * This file is part of Catacomb.
+ *
+ * Catacomb is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * Catacomb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Library General Public
+ * License along with Catacomb; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+/*----- Revision history --------------------------------------------------* 
+ *
+ * $Log: square.c,v $
+ * Revision 1.1  2000/07/15 20:51:58  mdw
+ * New block cipher.
+ *
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <assert.h>
+#include <stdio.h>
+
+#include <mLib/bits.h>
+
+#include "blkc.h"
+#include "gcipher.h"
+#include "paranoia.h"
+#include "square.h"
+#include "square-tab.h"
+
+/*----- Global variables --------------------------------------------------*/
+
+const octet square_keysz[] = { KSZ_RANGE, SQUARE_KEYSZ, 4, 16, 4 };
+
+/*----- Constant tables ---------------------------------------------------*/
+
+static const octet S[256] = SQUARE_S, SI[256] = SQUARE_SI;
+static const uint32 T[4][256] = SQUARE_T, TI[4][256] = SQUARE_TI;
+static const uint32 U[4][256] = SQUARE_U;
+static const octet rcon[] = SQUARE_RCON;
+
+/*----- Main code ---------------------------------------------------------*/
+
+#define BYTESUB(x, s)                                                  \
+  (s[U8((x) >> 24)] << 24 | s[U8((x) >> 16)] << 16 |                   \
+   s[U8((x) >>  8)] <<  8 | s[U8((x) >>  0)] <<  0)
+
+/* --- @square_init@ --- *
+ *
+ * Arguments:  @square_ctx *k@ = pointer to context to initialize
+ *             @const void *buf@ = pointer to buffer of key material
+ *             @size_t sz@ = size of the key material
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a Square context with a particular key.  Square
+ *             keys must be a multiple of 32 bits long, and may be at most
+ *             128 bits.
+ */
+
+void square_init(square_ctx *k, const void *buf, size_t sz)
+{
+  unsigned nk, nr, nw;
+  unsigned i, j, jj;
+  const octet *p;
+  uint32 ww;
+  uint32 kk[SQUARE_KWORDS];
+
+  /* --- Sort out the key size --- */
+
+  KSZ_ASSERT(square, sz);
+  nk = sz / 4;
+
+  /* --- Fetch the first key words out --- */
+
+  p = buf;
+  for (i = 0; i < nk; i++) {
+    kk[i] = LOAD32_L(p);
+    p += 4;
+  }
+  nr = 8;
+
+  /* --- Expand this material to fill the rest of the table --- */
+
+  nw = (nr + 1) * 4;
+  ww = kk[i - 1];
+  p = rcon;
+  for (; i < nw; i++) {
+    uint32 w = kk[i - nk];
+    if (i % nk == 0) {
+      ww = ROR32(ww, 8);
+      w ^= ww ^ *p++;
+    } else
+      w ^= ww;
+    kk[i] = ww = w;
+  }
+
+  /* --- Make the encryption and decryption keys --- */
+
+  for (i = 0; i < nr * 4; i++) {
+    uint32 w = kk[i];
+    k->w[i] = (U[0][U8(w >>  0)] ^ U[1][U8(w >>  8)] ^
+              U[2][U8(w >> 16)] ^ U[3][U8(w >> 24)]);
+  }
+  for (; i < nw; i++)
+    k->w[i] = kk[i];
+
+  jj = nw;
+  for (i = 0; i < nr * 4; i += 4) {
+    jj -= 4;
+    for (j = 0; j < 4; j++)
+      k->wi[i + j] = kk[jj + j];
+  }
+  for (j = 0; j < 4; j++)
+    k->wi[i + j] = k->w[j];
+
+  BURN(kk);
+}
+
+/* --- @square_eblk@, @square_dblk@ --- *
+ *
+ * Arguments:  @const square_ctx *k@ = pointer to Square context
+ *             @const uint32 s[4]@ = pointer to source block
+ *             @uint32 d[4]@ = pointer to destination block
+ *
+ * Returns:    ---
+ *
+ * Use:                Low-level block encryption and decryption.
+ */
+
+#define EROUND(aa, bb, cc, dd, a, b, c, d, w) do {                     \
+  aa = (T[0][U8(a >>  0)] ^ T[1][U8(b >>  0)] ^                                \
+       T[2][U8(c >>  0)] ^ T[3][U8(d >>  0)]) ^ *w++;                  \
+  bb = (T[0][U8(a >>  8)] ^ T[1][U8(b >>  8)] ^                                \
+       T[2][U8(c >>  8)] ^ T[3][U8(d >>  8)]) ^ *w++;                  \
+  cc = (T[0][U8(a >> 16)] ^ T[1][U8(b >> 16)] ^                                \
+       T[2][U8(c >> 16)] ^ T[3][U8(d >> 16)]) ^ *w++;                  \
+  dd = (T[0][U8(a >> 24)] ^ T[1][U8(b >> 24)] ^                                \
+       T[2][U8(c >> 24)] ^ T[3][U8(d >> 24)]) ^ *w++;                  \
+} while (0)
+
+#define DROUND(aa, bb, cc, dd, a, b, c, d, w) do {                     \
+  aa = (TI[0][U8(a >>  0)] ^ TI[1][U8(b >>  0)] ^                      \
+       TI[2][U8(c >>  0)] ^ TI[3][U8(d >>  0)]) ^ *w++;                \
+  bb = (TI[0][U8(a >>  8)] ^ TI[1][U8(b >>  8)] ^                      \
+       TI[2][U8(c >>  8)] ^ TI[3][U8(d >>  8)]) ^ *w++;                \
+  cc = (TI[0][U8(a >> 16)] ^ TI[1][U8(b >> 16)] ^                      \
+       TI[2][U8(c >> 16)] ^ TI[3][U8(d >> 16)]) ^ *w++;                \
+  dd = (TI[0][U8(a >> 24)] ^ TI[1][U8(b >> 24)] ^                      \
+       TI[2][U8(c >> 24)] ^ TI[3][U8(d >> 24)]) ^ *w++;                \
+} while (0)
+
+void square_eblk(const square_ctx *k, const uint32 *s, uint32 *dst)
+{
+  uint32 a = s[0], b = s[1], c = s[2], d = s[3];
+  uint32 aa, bb, cc, dd;
+  uint32 *w = k->w;
+
+  a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++;
+
+  EROUND(aa, bb, cc, dd, a, b, c, d, w);
+  EROUND(a, b, c, d, aa, bb, cc, dd, w);
+  EROUND(aa, bb, cc, dd, a, b, c, d, w);
+  EROUND(a, b, c, d, aa, bb, cc, dd, w);
+  EROUND(aa, bb, cc, dd, a, b, c, d, w);
+  EROUND(a, b, c, d, aa, bb, cc, dd, w);
+  EROUND(aa, bb, cc, dd, a, b, c, d, w);
+
+  a = ((S[U8(aa >>  0)] <<  0) ^ (S[U8(bb >>  0)] <<  8) ^
+       (S[U8(cc >>  0)] << 16) ^ (S[U8(dd >>  0)] << 24)) ^ *w++;
+  b = ((S[U8(aa >>  8)] <<  0) ^ (S[U8(bb >>  8)] <<  8) ^     
+       (S[U8(cc >>  8)] << 16) ^ (S[U8(dd >>  8)] << 24)) ^ *w++;
+  c = ((S[U8(aa >> 16)] <<  0) ^ (S[U8(bb >> 16)] <<  8) ^
+       (S[U8(cc >> 16)] << 16) ^ (S[U8(dd >> 16)] << 24)) ^ *w++;
+  d = ((S[U8(aa >> 24)] <<  0) ^ (S[U8(bb >> 24)] <<  8) ^
+       (S[U8(cc >> 24)] << 16) ^ (S[U8(dd >> 24)] << 24)) ^ *w++;
+
+  dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d;
+}
+
+void square_dblk(const square_ctx *k, const uint32 *s, uint32 *dst)
+{
+  uint32 a = s[0], b = s[1], c = s[2], d = s[3];
+  uint32 aa, bb, cc, dd;
+  uint32 *w = k->wi;
+
+  a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++;
+
+  DROUND(aa, bb, cc, dd, a, b, c, d, w);
+  DROUND(a, b, c, d, aa, bb, cc, dd, w);
+  DROUND(aa, bb, cc, dd, a, b, c, d, w);
+  DROUND(a, b, c, d, aa, bb, cc, dd, w);
+  DROUND(aa, bb, cc, dd, a, b, c, d, w);
+  DROUND(a, b, c, d, aa, bb, cc, dd, w);
+  DROUND(aa, bb, cc, dd, a, b, c, d, w);
+
+  a = ((SI[U8(aa >>  0)] <<  0) ^ (SI[U8(bb >>  0)] <<  8) ^
+       (SI[U8(cc >>  0)] << 16) ^ (SI[U8(dd >>  0)] << 24)) ^ *w++;
+  b = ((SI[U8(aa >>  8)] <<  0) ^ (SI[U8(bb >>  8)] <<  8) ^
+       (SI[U8(cc >>  8)] << 16) ^ (SI[U8(dd >>  8)] << 24)) ^ *w++;
+  c = ((SI[U8(aa >> 16)] <<  0) ^ (SI[U8(bb >> 16)] <<  8) ^
+       (SI[U8(cc >> 16)] << 16) ^ (SI[U8(dd >> 16)] << 24)) ^ *w++;
+  d = ((SI[U8(aa >> 24)] <<  0) ^ (SI[U8(bb >> 24)] <<  8) ^
+       (SI[U8(cc >> 24)] << 16) ^ (SI[U8(dd >> 24)] << 24)) ^ *w++;
+
+  dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d;
+}
+
+BLKC_TEST(SQUARE, square)
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/square.h b/square.h
new file mode 100644 (file)
index 0000000..6956536
--- /dev/null
+++ b/square.h
@@ -0,0 +1,125 @@
+/* -*-c-*-
+ *
+ * $Id: square.h,v 1.1 2000/07/15 20:51:58 mdw Exp $
+ *
+ * The Square block cipher
+ *
+ * (c) 2000 Straylight/Edgeware
+ */
+
+/*----- Licensing notice --------------------------------------------------* 
+ *
+ * This file is part of Catacomb.
+ *
+ * Catacomb is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * Catacomb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Library General Public
+ * License along with Catacomb; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+/*----- Revision history --------------------------------------------------* 
+ *
+ * $Log: square.h,v $
+ * Revision 1.1  2000/07/15 20:51:58  mdw
+ * New block cipher.
+ *
+ * Revision 1.1  2000/06/17 11:56:07  mdw
+ * New cipher.
+ *
+ */
+
+/*----- Notes on the Square block cipher ----------------------------------*
+ *
+ * Invented by Joan Daemen and Vincent Rijmen, Square is a fast and
+ * relatively simple 128-bit block cipher.  It is the predecessor to
+ * Rijndael.  I have grave doubts about the security of Square, though: a
+ * dedicated attack against Square's structure by Knudsen has been extended
+ * by the Twofish team against Rijndael, and I believe that this extended
+ * attack is also effective against Square.  This is a shame: the structure
+ * of Square (and Rijndael) is extremely elegant, and has some extremely nice
+ * properties.
+ */
+
+#ifndef CATACOMB_SQUARE_H
+#define CATACOMB_SQUARE_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <stddef.h>
+
+#include <mLib/bits.h>
+
+/*----- Magical numbers ---------------------------------------------------*/
+
+#define SQUARE_BLKSZ 16
+#define SQUARE_KEYSZ 16
+#define SQUARE_CLASS (N, L, 128)
+
+extern const octet square_keysz[];
+
+/*----- Data structures ---------------------------------------------------*/
+
+#define SQUARE_MAXROUNDS 8
+#define SQUARE_KWORDS ((SQUARE_MAXROUNDS + 1) * (SQUARE_BLKSZ / 4))
+
+typedef struct square_ctx {
+  uint32 w[SQUARE_KWORDS];
+  uint32 wi[SQUARE_KWORDS];
+} square_ctx;
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @square_init@ --- *
+ *
+ * Arguments:  @square_ctx *k@ = pointer to context to initialize
+ *             @const void *buf@ = pointer to buffer of key material
+ *             @size_t sz@ = size of the key material
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a Square context with a particular key.  This
+ *             implementation of Square doesn't impose any particular
+ *             limits on the key size except that it must be multiple of 4
+ *             bytes long.  256 bits seems sensible, though.
+ */
+
+extern void square_init(square_ctx */*k*/,
+                         const void */*buf*/, size_t /*sz*/);
+
+/* --- @square_eblk@, @square_dblk@ --- *
+ *
+ * Arguments:  @const square_ctx *k@ = pointer to Square context
+ *             @const uint32 s[4]@ = pointer to source block
+ *             @uint32 d[4]@ = pointer to destination block
+ *
+ * Returns:    ---
+ *
+ * Use:                Low-level block encryption and decryption.
+ */
+
+extern void square_eblk(const square_ctx */*k*/,
+                         const uint32 */*s*/, uint32 */*dst*/);
+extern void square_dblk(const square_ctx */*k*/,
+                         const uint32 */*s*/, uint32 */*dst*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
diff --git a/tests/square b/tests/square
new file mode 100644 (file)
index 0000000..360d56b
--- /dev/null
@@ -0,0 +1,525 @@
+# $Id: square,v 1.1 2000/07/15 20:51:59 mdw Exp $
+#
+# Test vectors for the Square block cipher
+
+square {
+  # --- From the reference implementation ---
+
+  000102030405060708090a0b0c0d0e0f
+       000102030405060708090a0b0c0d0e0f 7c3491d94994e70f0ec2e7a5ccb5a14f;
+
+  # --- From the validation data ---
+
+  80000000000000000000000000000000
+       00000000000000000000000000000000 05f8aafdefb4f5f9c751e5b36c8a37d8;
+  40000000000000000000000000000000
+       00000000000000000000000000000000 60affc9b2312b1397177251cc9296391;
+  20000000000000000000000000000000
+       00000000000000000000000000000000 d67b7e07c38f311446e16ddd9ea96ebe;
+  10000000000000000000000000000000
+       00000000000000000000000000000000 39207579067031706fab8c3a5c6e5524;
+  08000000000000000000000000000000
+       00000000000000000000000000000000 fc4f2602a3f6ac34f56906c2eeee40c5;
+  04000000000000000000000000000000
+       00000000000000000000000000000000 6f2431469f4a0866632216c59c18ff11;
+  02000000000000000000000000000000
+       00000000000000000000000000000000 c745f6f339d1bb9524e1b2d2b0dde843;
+  01000000000000000000000000000000
+       00000000000000000000000000000000 241e113a1bb5c32cc45d95d7734165aa;
+  00800000000000000000000000000000
+       00000000000000000000000000000000 5e16777211c67ae4609f6a47bf5df2c4;
+  00400000000000000000000000000000
+       00000000000000000000000000000000 272330139236c300cd161f0266b62494;
+  00200000000000000000000000000000
+       00000000000000000000000000000000 15115b9e29524325e7c992ead262ade8;
+  00100000000000000000000000000000
+       00000000000000000000000000000000 acdcce277b801ed53dfe0fc12f4c957b;
+  00080000000000000000000000000000
+       00000000000000000000000000000000 9cadb290cedd6f7ca6c10d42fe4c1a70;
+  00040000000000000000000000000000
+       00000000000000000000000000000000 d70d4c24ffbf3de6e6bd54ec03b8492a;
+  00020000000000000000000000000000
+       00000000000000000000000000000000 602455a418a99a942fed27123b9f73e6;
+  00010000000000000000000000000000
+       00000000000000000000000000000000 f239c4efd3729d43081544104378f0ea;
+  00008000000000000000000000000000
+       00000000000000000000000000000000 70259a9572990099ac563114074db3d2;
+  00004000000000000000000000000000
+       00000000000000000000000000000000 932d3644863b6377100c64f243445e7e;
+  00002000000000000000000000000000
+       00000000000000000000000000000000 47100bf12f2e1f718e9430f4127535be;
+  00001000000000000000000000000000
+       00000000000000000000000000000000 2ed60ffa71c162a53c3a8bba2b0b042b;
+  00000800000000000000000000000000
+       00000000000000000000000000000000 e2992d6bdc7c65b70b62685c0d84425c;
+  00000400000000000000000000000000
+       00000000000000000000000000000000 c552ca3d805e456f5239dd7956cacd71;
+  00000200000000000000000000000000
+       00000000000000000000000000000000 95b577c2ed3c2d9d96c2106e091b1f72;
+  00000100000000000000000000000000
+       00000000000000000000000000000000 3d550ae470bfb0306c3099c8d5a471d8;
+  00000080000000000000000000000000
+       00000000000000000000000000000000 fc13974afe73a92598aa95edcb2102e9;
+  00000040000000000000000000000000
+       00000000000000000000000000000000 ab0cf3a0cfef3aa3d10738523e624a1d;
+  00000020000000000000000000000000
+       00000000000000000000000000000000 72fea53144f673e283547f08da30bdda;
+  00000010000000000000000000000000
+       00000000000000000000000000000000 389fef99fa1a3dbf664673aa39d848d1;
+  00000008000000000000000000000000
+       00000000000000000000000000000000 041152bca8440e8de572dce9dcc88cdc;
+  00000004000000000000000000000000
+       00000000000000000000000000000000 845b37c1338a0ba0f295be273841b940;
+  00000002000000000000000000000000
+       00000000000000000000000000000000 e2e3a1c7998040ee6bd8714e65ebd8af;
+  00000001000000000000000000000000
+       00000000000000000000000000000000 0b2b34c480648dc91f938dd368464780;
+  00000000800000000000000000000000
+       00000000000000000000000000000000 96bad4a54376917044b1076727a91e2b;
+  00000000400000000000000000000000
+       00000000000000000000000000000000 dd8c3dff69c3fda2802dffcdef1b1631;
+  00000000200000000000000000000000
+       00000000000000000000000000000000 da45872e48af2f0ec7fc395d03ff9451;
+  00000000100000000000000000000000
+       00000000000000000000000000000000 b25194c0f1953f35bc4c0871cd2d4a40;
+  00000000080000000000000000000000
+       00000000000000000000000000000000 3e09af82736971f2847834082d6ec6f3;
+  00000000040000000000000000000000
+       00000000000000000000000000000000 fa75a64f778b914dc4b926626bc8b4c0;
+  00000000020000000000000000000000
+       00000000000000000000000000000000 d21542857f03f6a92cacd2e783e33e3e;
+  00000000010000000000000000000000
+       00000000000000000000000000000000 1ec0a5b9781c5e90b1e15731e0625c36;
+  00000000008000000000000000000000
+       00000000000000000000000000000000 e1c58917e586b6c46c46982fa303f14c;
+  00000000004000000000000000000000
+       00000000000000000000000000000000 72ecc0d267b445482924c9969de97a15;
+  00000000002000000000000000000000
+       00000000000000000000000000000000 a52af631193375dd59555e2753acde65;
+  00000000001000000000000000000000
+       00000000000000000000000000000000 033b8482c4010eb20a3edd4ba35a3db7;
+  00000000000800000000000000000000
+       00000000000000000000000000000000 56534a944796abdf51ad247b8c9ee9bb;
+  00000000000400000000000000000000
+       00000000000000000000000000000000 9eda6fd2cd4eabf8218b98a165e82b9e;
+  00000000000200000000000000000000
+       00000000000000000000000000000000 60043a7e110e1321bc41e4ac47d1f45e;
+  00000000000100000000000000000000
+       00000000000000000000000000000000 90e685c8f990cedeacc8a2bfc8e46ca2;
+  00000000000080000000000000000000
+       00000000000000000000000000000000 b9e77e32f721c0a7a02b50925311e834;
+  00000000000040000000000000000000
+       00000000000000000000000000000000 001d2fe95bb39ef0c3548307ea7580f3;
+  00000000000020000000000000000000
+       00000000000000000000000000000000 a5dd651290a063f4e7c5e714c9c398b4;
+  00000000000010000000000000000000
+       00000000000000000000000000000000 aa7b3b9f459ba0367ff2a332ef725da1;
+  00000000000008000000000000000000
+       00000000000000000000000000000000 a424f80b0048756879ed6343768bbe08;
+  00000000000004000000000000000000
+       00000000000000000000000000000000 ea4590786de7f8a68439b4616bf7e4b9;
+  00000000000002000000000000000000
+       00000000000000000000000000000000 7d15058fe884dcf0976105a816cf6366;
+  00000000000001000000000000000000
+       00000000000000000000000000000000 a07d1b74ae6a3f26a8a25e1e778a0d4a;
+  00000000000000800000000000000000
+       00000000000000000000000000000000 61f13db32828961c3e35d9b7ab77b57d;
+  00000000000000400000000000000000
+       00000000000000000000000000000000 0e2979112efb29754605011a358093fc;
+  00000000000000200000000000000000
+       00000000000000000000000000000000 a878c8a8a5230917c56f7eb74fdada25;
+  00000000000000100000000000000000
+       00000000000000000000000000000000 34343f73232790e6fa44d8f606a24de9;
+  00000000000000080000000000000000
+       00000000000000000000000000000000 d569b991761c26dde723cca0c262f195;
+  00000000000000040000000000000000
+       00000000000000000000000000000000 f1a0f35ada018c5df56ffe0dc95636bf;
+  00000000000000020000000000000000
+       00000000000000000000000000000000 b26af455039312e1206290a921459e1a;
+  00000000000000010000000000000000
+       00000000000000000000000000000000 594049c7e3a34e1b9bccefaf5e75b373;
+  00000000000000008000000000000000
+       00000000000000000000000000000000 4e4e037f07ff26e8e9065f26afedaf2d;
+  00000000000000004000000000000000
+       00000000000000000000000000000000 ddedc3ca10ec011ea24dd4566d21409c;
+  00000000000000002000000000000000
+       00000000000000000000000000000000 3660f51bb790f275a55aa435db6da193;
+  00000000000000001000000000000000
+       00000000000000000000000000000000 a9a7cfe07ea640498e832ae25e2906ed;
+  00000000000000000800000000000000
+       00000000000000000000000000000000 3863d1c222a36338ea6d402073341f42;
+  00000000000000000400000000000000
+       00000000000000000000000000000000 ced5dfdf8b5d1d60e9ad51830a7965a9;
+  00000000000000000200000000000000
+       00000000000000000000000000000000 4ffae5d7a5689a5584330cb0a5cc9cd2;
+  00000000000000000100000000000000
+       00000000000000000000000000000000 1dd688d47541463915f658bb656420b4;
+  00000000000000000080000000000000
+       00000000000000000000000000000000 ef3a1c1800dd3cda748fbdf17086ba4f;
+  00000000000000000040000000000000
+       00000000000000000000000000000000 f9aa9b3e76543ef12f7f8b87ce393328;
+  00000000000000000020000000000000
+       00000000000000000000000000000000 1813935bb67dc40dc37c68cc2999758a;
+  00000000000000000010000000000000
+       00000000000000000000000000000000 8c4916d59fce8eb913b128f2d7b3d464;
+  00000000000000000008000000000000
+       00000000000000000000000000000000 bb88da704c5ce031c61954efcae6ed2d;
+  00000000000000000004000000000000
+       00000000000000000000000000000000 4e463bceb0f52c3f722e2926c2bd04a3;
+  00000000000000000002000000000000
+       00000000000000000000000000000000 4a6181492a454604293396bbd21c4956;
+  00000000000000000001000000000000
+       00000000000000000000000000000000 801f29d5462365735a6ca7a64288f48c;
+  00000000000000000000800000000000
+       00000000000000000000000000000000 7933733c4daab746ef048edba2d05538;
+  00000000000000000000400000000000
+       00000000000000000000000000000000 4127c1d95431fd2632f2b5e5085a3dd8;
+  00000000000000000000200000000000
+       00000000000000000000000000000000 0588168ca7525333460c4030af266388;
+  00000000000000000000100000000000
+       00000000000000000000000000000000 32b3f193d7237b48883de002b3cbe1c3;
+  00000000000000000000080000000000
+       00000000000000000000000000000000 7ca557bc05b845a233c01412022da825;
+  00000000000000000000040000000000
+       00000000000000000000000000000000 54f11361ad6dfbb069be67536cc98d81;
+  00000000000000000000020000000000
+       00000000000000000000000000000000 a9df031b4e25e89f527efff89cb0beba;
+  00000000000000000000010000000000
+       00000000000000000000000000000000 7da4d0d6309906d935ba27ae00cfaf33;
+  00000000000000000000008000000000
+       00000000000000000000000000000000 e231ea0fec29d983d3236bb15e7cd1da;
+  00000000000000000000004000000000
+       00000000000000000000000000000000 fe1b963a4f596422a6cd7787f4ab3377;
+  00000000000000000000002000000000
+       00000000000000000000000000000000 848833f2f7a247d2e1d0c8614694139f;
+  00000000000000000000001000000000
+       00000000000000000000000000000000 630bb1dc4e60d3272b6b673bdb918b20;
+  00000000000000000000000800000000
+       00000000000000000000000000000000 500251a5c6ad5a6d2f218a3fd5765727;
+  00000000000000000000000400000000
+       00000000000000000000000000000000 d019ef316e84149cfd0e85665aa2fff5;
+  00000000000000000000000200000000
+       00000000000000000000000000000000 db0b5ac0e8ef011d710323fa3b8bb3a7;
+  00000000000000000000000100000000
+       00000000000000000000000000000000 207e46a533617374d2c9da0c92ffd620;
+  00000000000000000000000080000000
+       00000000000000000000000000000000 8273ca155249f9f1ad8cc2ca114984f3;
+  00000000000000000000000040000000
+       00000000000000000000000000000000 82a73a18aae84ad671e226470f246e1a;
+  00000000000000000000000020000000
+       00000000000000000000000000000000 3e0e1206e333917d4c250bd82fef6afd;
+  00000000000000000000000010000000
+       00000000000000000000000000000000 2182f67239be15c796439ea3791202e1;
+  00000000000000000000000008000000
+       00000000000000000000000000000000 486fb3fa7b1fe1a304cb4e8960c3c6bb;
+  00000000000000000000000004000000
+       00000000000000000000000000000000 c1de50e456c4308d5d70da141cef0b4f;
+  00000000000000000000000002000000
+       00000000000000000000000000000000 a623f24515a27cee3dad277429000218;
+  00000000000000000000000001000000
+       00000000000000000000000000000000 02fa5762f9cd90201565bce71140c6f4;
+  00000000000000000000000000800000
+       00000000000000000000000000000000 a643a0ca5154a7d10b251d562d58ea53;
+  00000000000000000000000000400000
+       00000000000000000000000000000000 48660e32b1c7ee7085e5b5e9f719c790;
+  00000000000000000000000000200000
+       00000000000000000000000000000000 a96366bb17b67e161fd8e33c3e1f3d2a;
+  00000000000000000000000000100000
+       00000000000000000000000000000000 5659ab825fc2de031a6998cacd741ff6;
+  00000000000000000000000000080000
+       00000000000000000000000000000000 1253e9e4079e9b573a73cf4ce08dc015;
+  00000000000000000000000000040000
+       00000000000000000000000000000000 28205442270c735d4ba79042dce81509;
+  00000000000000000000000000020000
+       00000000000000000000000000000000 98cfb10f3ed70bb82cc90597b463a1f6;
+  00000000000000000000000000010000
+       00000000000000000000000000000000 cab40433631fe3a272fc401255a58064;
+  00000000000000000000000000008000
+       00000000000000000000000000000000 abb041d85114da88e65e8bdcf1c67cc8;
+  00000000000000000000000000004000
+       00000000000000000000000000000000 00f0926f0f9eaa0a6238dfce79c8f596;
+  00000000000000000000000000002000
+       00000000000000000000000000000000 7c662d01b12d9845705b2bd4d7aef43d;
+  00000000000000000000000000001000
+       00000000000000000000000000000000 8f1cc7a0fbe7d70a894d09e12fb22bb8;
+  00000000000000000000000000000800
+       00000000000000000000000000000000 ebe03d0c6752d0edfebff879c33d8c07;
+  00000000000000000000000000000400
+       00000000000000000000000000000000 b74ce7f67bbd969e8ff8862d1fb1715c;
+  00000000000000000000000000000200
+       00000000000000000000000000000000 63ad5ea9d599ec848a40d489c0b85e8a;
+  00000000000000000000000000000100
+       00000000000000000000000000000000 4e4167f091ea5776e80fb2fca38c2a04;
+  00000000000000000000000000000080
+       00000000000000000000000000000000 dbf0cea3a5ed5b884ac13a2a62c32d51;
+  00000000000000000000000000000040
+       00000000000000000000000000000000 7e86285068a376a3b9fe8641a38e3f90;
+  00000000000000000000000000000020
+       00000000000000000000000000000000 aec1ef8d651a2cf7b5475fcc7fb7a81a;
+  00000000000000000000000000000010
+       00000000000000000000000000000000 fda539d910181ce1a1e1db4c3459600b;
+  00000000000000000000000000000008
+       00000000000000000000000000000000 f8072bf053d5b5163949ff0b9bb3f81a;
+  00000000000000000000000000000004
+       00000000000000000000000000000000 a31eb966d34ed6a6132a6b6e9128e997;
+  00000000000000000000000000000002
+       00000000000000000000000000000000 673aebbff82091a19e758ece151811d0;
+  00000000000000000000000000000001
+       00000000000000000000000000000000 369bdb6f102d6bfea7645b1a6753bf37;
+  80000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ffd90e8a92a1b025108168714f7923f7;
+  40000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 64e10ab587bc5d996cf2186c2ff2dd58;
+  20000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 eaa404b51336a16c963735588b0b2a0c;
+  10000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 51aaa1e37cb08cf5c6ec9241ac36b4c5;
+  08000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c21b34c3c077b30add67d0e2e75e59ec;
+  04000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 f33ccd4771932f5e467552e93ae367ab;
+  02000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 b70b9f3a5814ddeb6d3549d88c5b4656;
+  01000000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 5c01c66e9bf9617b155d3902722ccadc;
+  00800000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 1f47def31d2e7e286172b38119fde307;
+  00400000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 bd3c2f005cf0eb5ef737c29f457ed549;
+  00200000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 1d409243f79ce876d13b0fdfea26ccf8;
+  00100000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 b879e37c2f435b0cb941f74892c1476f;
+  00080000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 58c6a8884bf8b110c9127893976a9e4e;
+  00040000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 7a258ac14cb88a31432ba1b320d254f6;
+  00020000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ff382f1b4bbb54c9f42b73b256f80d25;
+  00010000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 0cef334bcbe5d38e23a9780d2e3e9097;
+  00008000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 3225e13778d2a3bab1eb375e034478c4;
+  00004000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 4ef73320931377f64e296e49c286e5c9;
+  00002000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 adbf2c07f2f42eb7d92acc07f9df7a5f;
+  00001000000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 bfca14ad6925ddb4f563048db1c6b485;
+  00000800000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 63f01ea46c82dc3b1d81eac5e4f1d687;
+  00000400000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 b2f6eb69ce81accc720e705146cfc2a2;
+  00000200000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 85b1ff06090504848fdda74dd830e960;
+  00000100000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 5bcb44ab29d7c31def58c902c2491333;
+  00000080000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 4d982cbc7c1455cde7c0de3f83fcbc5e;
+  00000040000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 32f08276e0633e1d819fc6227e631503;
+  00000020000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e6bebd4cddc205399126bfda486ed37c;
+  00000010000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 afe39df4f356aea5f07069455010d9ce;
+  00000008000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 a8c7b2c1e8e1ade5e28e4104ff716ba5;
+  00000004000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 fbb3e4ca3e710a5bd94b50726de5fdb1;
+  00000002000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 2091d65d6fbb8672d84655f33dc1473a;
+  00000001000000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 9c74519acc53498333791febfd0e5e8b;
+  00000000800000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ed44022a82468ed54203b5863b63061f;
+  00000000400000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 eae325499a1a9e8e1bd4d6f018e65551;
+  00000000200000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 b134fe1498d7a1d926d3a623ffa5723e;
+  00000000100000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 343f8d08a35c272c5cd4064a42a7b6d8;
+  00000000080000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 79230ea5d7f6b5d85922ed7679aebe08;
+  00000000040000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d3f799e3579c68e10fb1c770b1cbb7c7;
+  00000000020000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 90c24054dc24772ecd92a67a43335320;
+  00000000010000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 bf38cfda7b75a478fa73316801883d34;
+  00000000008000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 4323a85f7921a4a1fc072b72b6b46f50;
+  00000000004000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 3e10218fdefd9a0b91d9032d793aecc8;
+  00000000002000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 66a759ec5e5cdd9c27a4e97ff0b5aab8;
+  00000000001000000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 3730876a26727d44a46404f69ba99f09;
+  00000000000800000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 b277bd5a0e78eafc049bd9aa3393870f;
+  00000000000400000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 af05cdd3a6dd19fb0199933bdea3c20f;
+  00000000000200000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 0d962ec5f824d922924f3c39339fa934;
+  00000000000100000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 de695dab525ffebc039f63c3defb200b;
+  00000000000080000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 f8ce4303ff6a523a60e3526a28c1c1de;
+  00000000000040000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c00c5250a33165254408992f6aa1fb97;
+  00000000000020000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 7e81d9c10bc3ac8fcac65079867183ff;
+  00000000000010000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 42f91fe46e5f6485973123b586cc2517;
+  00000000000008000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 0900c5c4bb963e1e421571056aeda9f0;
+  00000000000004000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 933312932700ef9c82333913782fc8fb;
+  00000000000002000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d78181179ac4cc05f38a1d134b29b70a;
+  00000000000001000000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 411b9bd8a8c3d3c9a2c375d28a336c4a;
+  00000000000000800000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 632433f8708bd47d6a083adbdf3a8982;
+  00000000000000400000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 f037e3fcd3db611bd777420b8170df1b;
+  00000000000000200000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 31da207bfbdbb93157408ad2d7e559df;
+  00000000000000100000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 2837b13cb713b5fde1bc07cb7b2613d9;
+  00000000000000080000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c31906513814506753848c50ab7c8d13;
+  00000000000000040000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 014b54ca9f1d87c7711af20119b03afc;
+  00000000000000020000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 060903be7b215ee51fbce79205b0515a;
+  00000000000000010000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 f91da002995fe07969ff63b8673fa75a;
+  00000000000000008000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 65a8b07ad4f77c8be4f27f975a42f2e7;
+  00000000000000004000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 31a157653449da846b5dade80e2f3ae8;
+  00000000000000002000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 1be98428352aeab7534e12463898bde5;
+  00000000000000001000000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 a7a50bec385145e784486d6d70552fbf;
+  00000000000000000800000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 eaacafae73701d566b24ab68350c4cb7;
+  00000000000000000400000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 deef8a7a5de90caaa0e3412356518d9a;
+  00000000000000000200000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 8d4373f4933353f589e42471ef35836c;
+  00000000000000000100000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 01436b7d351b9ff0fe85dab7ef77a020;
+  00000000000000000080000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 a6b2b93c4c6dafea4db5a4ecfee2c561;
+  00000000000000000040000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 7b0f7781683d890db4582d4399b07fab;
+  00000000000000000020000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 01c82b395331de265555d72df29c7efc;
+  00000000000000000010000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 5d9ba76d5b20b4b88b70b80c20c5e350;
+  00000000000000000008000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 92b2a69dd8a75d2edb01644a0b975c15;
+  00000000000000000004000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e2f6e46a2a899615969f4b751d55d57f;
+  00000000000000000002000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 97427298315d058eb2f7cdabd4a851c8;
+  00000000000000000001000000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 8f0f710a0cc1d6049ebb01974b76caad;
+  00000000000000000000800000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 2cf62d9d02afb40eed66fedb53c2db5c;
+  00000000000000000000400000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 fb215ab9ec3fafc5fd91cd9ad3cee2be;
+  00000000000000000000200000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 4a37472335edaf7393a304d45a233085;
+  00000000000000000000100000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d22a878d2ca3a88f34acc92a4e26c738;
+  00000000000000000000080000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 f1a95970638dcbc69c4675e895370904;
+  00000000000000000000040000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 1660060085c0e241f88462bffbe67602;
+  00000000000000000000020000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 a097acb2eb5f779090f886beae746ae1;
+  00000000000000000000010000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 9ffe05163407ba53b62a35d857f58bc6;
+  00000000000000000000008000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 dfed8392eec1b389cbc261faf97c5c9e;
+  00000000000000000000004000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d2c1b3159129d86959f3aa9b70219a74;
+  00000000000000000000002000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 98c043b2e86cff626abf5fbc745d98a6;
+  00000000000000000000001000000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 35c5aed481c801a0ca78842273e0186d;
+  00000000000000000000000800000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ddaac5c7f13943e80d2244a4a19e9980;
+  00000000000000000000000400000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 51dbf12fc81e5ffe9b1ce9963636205f;
+  00000000000000000000000200000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 38ee89874d644ccdf9694280a6c48182;
+  00000000000000000000000100000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c3bc93ca8e8800622c92c56b99262ae2;
+  00000000000000000000000080000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 dc2c2b7558f75b71a9db34e971892171;
+  00000000000000000000000040000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 609bd72078f92ae345dcde14e6aba0e0;
+  00000000000000000000000020000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 cabc8bdda6e1979199f5010c3f8b8a31;
+  00000000000000000000000010000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c993d659ba4426dc30f8dc7ea03cd2ee;
+  00000000000000000000000008000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 5dd47466cbb15dca1485e04231d7491c;
+  00000000000000000000000004000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e1351ce84ded187e0f5aab9bb7198387;
+  00000000000000000000000002000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e5222c68fda26e5e62929c70233ad097;
+  00000000000000000000000001000000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 78cc456147db73850328241bdff861c0;
+  00000000000000000000000000800000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 4f10436e3ba4f38cd96744b897d5a136;
+  00000000000000000000000000400000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 12b698464abcb67c3956c5d1b9c62dfd;
+  00000000000000000000000000200000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 49de5db3e7d997c56dd2f82935e6617f;
+  00000000000000000000000000100000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 71ea115e54775680f16b1b9d7b2ee367;
+  00000000000000000000000000080000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 45b7e46c664a472af948b0c393f92af1;
+  00000000000000000000000000040000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 db3678b993ef5e48931b5bf84cece6eb;
+  00000000000000000000000000020000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 051c9a17d4ca77eabd8b9d9a1bce52d6;
+  00000000000000000000000000010000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e805aeeac134761ff7b3260bb4308a10;
+  00000000000000000000000000008000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 3301700109b460c7e41a51059f33004f;
+  00000000000000000000000000004000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d71f178093314e188bae26dde5a78927;
+  00000000000000000000000000002000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 31bb9cb46fbf607fcaa5932851899420;
+  00000000000000000000000000001000
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ea77bcd0ce469ab47a828dc6324c3651;
+  00000000000000000000000000000800
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e4596b0d33bdeb062a7ddb93e6efae94;
+  00000000000000000000000000000400
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 24d04f34b837461cd3b8d9c13afe6fe5;
+  00000000000000000000000000000200
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 ffb68c9ae4d7d2642bf5bee57d2bd914;
+  00000000000000000000000000000100
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 c008d35eb9de15700c0491319e6415f0;
+  00000000000000000000000000000080
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 92bfbbfcd2bbf54fff06af097893e9a3;
+  00000000000000000000000000000040
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 d2475279191bc4da183ee2dba75fce6d;
+  00000000000000000000000000000020
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 7b8adf2ef0e1f5fbb19cbd4b8fab1426;
+  00000000000000000000000000000010
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 0b07b9c4385bdc86447f535e09a9f424;
+  00000000000000000000000000000008
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 e7308875d8d6645719c076dd1660924b;
+  00000000000000000000000000000004
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 bc50d54a891d6102d0c02f471f1f0567;
+  00000000000000000000000000000002
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 2b14534ca7d9821a40b101035f681f0d;
+  00000000000000000000000000000001
+       0f1e2d3c4b5a69788796a5b4c3d2e1f0 69bd984641e0aa887bc23738f60070db;
+}