symm/strobe.c: Implement Hamburg's STROBE framework.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 25 Nov 2018 11:40:32 +0000 (11:40 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 9 May 2020 19:57:33 +0000 (20:57 +0100)
debian/catacomb2.symbols
symm/Makefile.am
symm/strobe.c [new file with mode: 0644]
symm/strobe.h [new file with mode: 0644]
symm/t/strobe [new file with mode: 0644]
utils/strobe [new file with mode: 0644]

index 44c2da7..ceec3f2 100644 (file)
@@ -4181,6 +4181,22 @@ libcatacomb.so.2 catacomb2 #MINVER#
        kmac128_rand@Base 2.0.0
        kmac256_rand@Base 2.0.0
 
+## strobe
+       strobe_init@Base 2.5.99~
+       strobe_begin@Base 2.5.99~
+       strobe_process@Base 2.5.99~
+       strobe_done@Base 2.5.99~
+       strobe_key@Base 2.5.99~
+       strobe_ad@Base 2.5.99~
+       strobe_prf@Base 2.5.99~
+       strobe_clrout@Base 2.5.99~
+       strobe_clrin@Base 2.5.99~
+       strobe_encout@Base 2.5.99~
+       strobe_encin@Base 2.5.99~
+       strobe_macout@Base 2.5.99~
+       strobe_macin@Base 2.5.99~
+       strobe_ratchet@Base 2.5.99~
+
 ## poly1305
        poly1305_keyinit@Base 2.4.0
        poly1305_keysz@Base 2.4.0
index 68d9267..48e5a22 100644 (file)
@@ -476,6 +476,12 @@ $(srcdir)/t/sha3: $(SHA3_TESTS) sha3-trans t/sha3.local
                  cat t/sha3.local; } >t/sha3.new && \
                mv t/sha3.new t/sha3
 
+## Mike Hamburg's STROBE protocol framework.
+pkginclude_HEADERS     += strobe.h
+libsymm_la_SOURCES     += strobe.c
+TESTS                  += strobe.t$(EXEEXT)
+EXTRA_DIST             += t/strobe
+
 ## Bellare, Canetti and Krawczyk's `HMAC' mode for message authentication.
 HASHMACMODES           += hmac
 
diff --git a/symm/strobe.c b/symm/strobe.c
new file mode 100644 (file)
index 0000000..8d4d42d
--- /dev/null
@@ -0,0 +1,694 @@
+/* -*-c-*-
+ *
+ * The STROBE protocol framework
+ *
+ * (c) 2018 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.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <assert.h>
+#include <ctype.h>
+#include <string.h>
+
+#include <mLib/buf.h>
+
+#include "keccak1600.h"
+#include "strobe.h"
+
+/*----- Magic constants ---------------------------------------------------*/
+
+#define DDATA 0x04
+#define DRATE 0x80
+
+/*----- Utilities ---------------------------------------------------------*/
+
+/* --- @crank@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Cycle the Keccak-p[1600, n] duplex function.
+ */
+
+static void crank(strobe_ctx *ctx)
+{
+  kludge64 t[25];
+  octet *p;
+  unsigned i;
+
+  /* Ensure that we've not overstepped the rate bound. */
+  assert(ctx->n <= ctx->r - 2);
+
+  /* Apply the cSHAKE and rate padding. */
+  ctx->buf[ctx->n] ^= ctx->n0;
+  ctx->buf[ctx->n + 1] ^= DDATA;
+  ctx->buf[ctx->r - 1] ^= DRATE;
+
+  /* Cycle the sponge. */
+  for (i = 0, p = ctx->buf; i < ctx->r/8; i++)
+    { LOAD64_L_(t[i], p); p += 8; }
+  keccak1600_set(&ctx->k, t, ctx->r/8);
+  keccak1600_p(&ctx->k, &ctx->k, 24);
+  keccak1600_extract(&ctx->k, t, ctx->r/8);
+  for (i = 0, p = ctx->buf; i < ctx->r/8; i++)
+    { STORE64_L_(p, t[i]); p += 8; }
+
+  /* Restart at the beginning of the buffer, and note this as a
+   * continuation.
+   */
+  ctx->n = ctx->n0 = 0;
+}
+
+/* --- @xorbuf@ --- *
+ *
+ * Arguments:  @octet *z@ = pointer to output buffer
+ *             @const octet *x, *y@ = pointer to input buffers
+ *             @size_t sz@ = common buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                Store the bytewise XOR of the buffers @x@ and @y@ in @z@.
+ *             The @x@ and @y@ may be equal, but otherwise the buffers must
+ *             not overlap.
+ */
+
+static void xorbuf(octet *z, const octet *x, const octet *y, size_t sz)
+  { size_t i; for (i = 0; i < sz; i++) *z++ = *x++ ^ *y++; }
+
+/* --- @nonzerop@ --- *
+ *
+ * Arguments:  @const octet *x@ = pointer to input buffer
+ *             @size_t sz@ = buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                If any byte of @x@ is nonzero, then return a nonzero value
+ *             between 1 and 255 inclusive; otherwise return zero.
+ */
+
+static unsigned nonzerop(const octet *x, size_t sz)
+{
+  unsigned z = 0;
+  size_t i;
+
+  for (i = 0; i < sz; i++) z |= *x++;
+  return (z);
+}
+
+/* --- @unequalp@ --- *
+ *
+ * Arguments:  @const octet *x, *y@ = pointer to input buffers
+ *             @size_t sz@ = common buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                If any respective bytes of @x@ and @y@ are unequal, then
+ *             return a nonzero value between 1 and 255 inclusive; otherwise
+ *             return zero.
+ */
+
+static unsigned unequalp(const octet *x, const octet *y, size_t sz)
+{
+  unsigned z = 0;
+  size_t i;
+
+  for (i = 0; i < sz; i++) z |= *x++ ^ *y++;
+  return (z);
+}
+
+/* --- @process_buffer@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *             @const octet *p@ = pointer to input buffer
+ *             @octet *q@ = pointer to output buffer
+ *             @size_t sz@ = common buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                Process a portion of a STROBE input small enough to be
+ *             satisfied from the internal buffer.
+ */
+
+static void process_buffer(strobe_ctx *ctx,
+                          const octet *p, octet *q, size_t sz)
+{
+  octet *b = ctx->buf + ctx->n;
+  unsigned z = 0;
+
+  if (!(ctx->f&STRBF_CRYPTO)) {
+    /* No crypto to do.  The `output' would be equal to the input, so that's
+     * rather uninteresting (and, indeed, forbidden).  If there's input, then
+     * mix it into the state.
+     */
+
+    if (p && (ctx->f&STRBF_VRFOUT)) z |= nonzerop(p, sz);
+    if (p) xorbuf(b, b, p, sz);
+  } else if (!(ctx->f&STRBF_MIXOUT)) {
+    /* Mix the input into the sponge state.  That means that the new state
+     * will be equal to the output.
+     */
+
+    if (p) xorbuf(b, b, p, sz);
+    if (ctx->f&STRBF_VRFOUT) z |= nonzerop(b, sz);
+    if (q) memcpy(q, b, sz);
+  } else if (p) {
+    /* Mix the output into the sponge state, so the new state will in fact be
+     * equal to the input.  If the input and output buffers are equal then we
+     * have a dance to do.
+     */
+
+    if (!q) {
+      if (ctx->f&STRBF_VRFOUT) z |= unequalp(p, b, sz);
+      memcpy(b, p, sz);
+    } else {
+      xorbuf(q, p, b, sz);
+      if (q != p) memcpy(b, p, sz);
+      else xorbuf(b, b, q, sz);
+      if (ctx->f&STRBF_VRFOUT) z |= nonzerop(q, sz);
+    }
+  } else {
+    /* As above, only the input is hardwired to zero.  That means that we
+     * copy state bytes to the output (if any), and just clobber the state
+     * when we're done.
+     */
+
+    if (q) memcpy(q, b, sz);
+    memset(b, 0, sz);
+  }
+
+  /* Set the @STRBF_NZERO@ flag if @z@ is nonzero.  If @z@ is zero then
+   * subtracting one will set all of its bits, so, in particular, bits
+   * 8--15.  Otherwise, @z@ is between 1 and 255, so bits 8--15 are clear and
+   * will remain so when we subtract one.
+   */
+  if (ctx->f&STRBF_VRFOUT) ctx->f |= ((z - 1)&STRBF_NZERO) ^ STRBF_NZERO;
+
+  /* Update the buffer cursor. */
+  ctx->n += sz;
+}
+
+/*----- Interface ---------------------------------------------------------*/
+
+/* --- @strobe_init@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block to initialize
+ *             @unsigned lambda@ = security parameter, in bits (must be a
+ *                     multiple of 32)
+ *
+ * Returns:    ---
+ *
+ * Use:                Initialize a STROBE context for use.
+ */
+
+void strobe_init(strobe_ctx *ctx, unsigned lambda)
+{
+  const char v[] = "STROBEv1.0.2";
+  kludge64 t[25];
+  octet *p;
+  buf b;
+  unsigned n, i;
+
+  /* Check the security parameter. */
+  assert(lambda%32 == 0); assert(lambda <= 704);
+  ctx->r = (1600 - 2*lambda)/8;
+
+  /* Set up the initial cSHAKE framing. */
+  buf_init(&b, ctx->buf, ctx->r);
+  buf_putu8(&b, 1); buf_putu8(&b, ctx->r);
+  buf_putu8(&b, 1); buf_putu8(&b, 0);
+  buf_putu8(&b, 1); buf_putu8(&b, 8*(sizeof(v) - 1));
+  buf_put(&b, v, sizeof(v) - 1);
+  assert(BOK(&b));
+  n = BLEN(&b); if (n%8) memset(ctx->buf + n, 0, 8 - n%8);
+
+  /* Cycle the sponge once initially, and get the first output buffer. */
+  keccak1600_init(&ctx->k);
+  for (i = 0, p = ctx->buf; i < (n + 7)/8; i++)
+    { LOAD64_L_(t[i], p); p += 8; }
+  keccak1600_set(&ctx->k, t, (n + 7)/8);
+  keccak1600_p(&ctx->k, &ctx->k, 24);
+  keccak1600_extract(&ctx->k, t, ctx->r/8);
+  for (i = 0, p = ctx->buf; i < ctx->r/8; i++)
+    { STORE64_L_(p, t[i]); p += 8; }
+
+  /* Initialize the other parts of the state. */
+  ctx->n = ctx->n0 = 0; ctx->f = 0;
+}
+
+/* --- @strobe_begin@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *             @unsigned op@ = bitmask of flags
+ *
+ * Returns:    ---
+ *
+ * Use:                Begin a STROBE operation.  The flags determine the behaviour
+ *             of the @strobe_process@ and @strobe_done@ functions.
+ *
+ *               * The @I@ bit determines the primary direction of data
+ *                 movement.  If it's clear, data comes from the application
+ *                 into STROBE.  If it's set, data comes from STROBE towards
+ *                 the application.
+ *
+ *               * The @C@ bit activates cryptographic processing.  If it's
+ *                 clear, then the input and output data would be equal, so
+ *                 @dest@ must be null.  If it's set, then input data is
+ *                 XORed with the keystream on its way to the output.
+ *
+ *               * The @A@ bit determines whether the application is
+ *                 engaged.  If it's set, then the input or output buffer
+ *                 (according to whether @I@ is clear or set, respectively)
+ *                 holds the application data.  If it's clear, and @I@ is
+ *                 clear, then zero bytes are fed in; if @I@ is set, then
+ *                 the output is compared with zero, and @strobe_done@
+ *                 reports the outcome of this comparison.
+ *
+ *               * The @T@ bit determines whether the transport is engaged.
+ *                 If it's set, then the input or output buffer (according
+ *                 to whether @I@ is set or clear, respectively) holds
+ *                 transport data.  If it's clear, and @I@ is set, then zero
+ *                 bytes are fed in; if @I@ is clear, then the output is
+ *                 discarded.
+ *
+ *               * The @M@ bit marks the data as metadata, but has no other
+ *                 effect.
+ */
+
+void strobe_begin(strobe_ctx *ctx, unsigned op)
+{
+  /* Preliminary checking.  We shouldn't have an operation underway, and the
+   * operation shouldn't have reserved bits set.
+   */
+  assert(!(ctx->f&STRBF_ACTIVE)); assert(!(op&~STRBF_VALIDMASK));
+
+  /* Reset our operation state. */
+  ctx->f &= STRBF_STMASK;
+
+  /* Operation framing.  Chain back to the start of the previous frame and
+   * write the new operation code.  Set the sticky asymmetry bit here if
+   * necessary.
+   */
+  ctx->buf[ctx->n++] ^= ctx->n0; ctx->n0 = ctx->n;
+  if (ctx->n >= ctx->r - 2) crank(ctx);
+  if (!(op&STRBF_T))
+    ctx->buf[ctx->n++] ^= U8(op);
+  else {
+    if (!(ctx->f&STRBF_INIT)) ctx->f |= STRBF_INIT | (op&STRBF_I);
+    ctx->buf[ctx->n++] ^= U8(op ^ ctx->f);
+  }
+  if (ctx->n >= ctx->r - 2 || (op&STRBF_C)) crank(ctx);
+
+  /* The operation is now underway. */
+  ctx->f |= STRBF_ACTIVE;
+
+  /* Determine whether we expect input and/or output. */
+  if (op&(op&STRBF_I ? STRBF_T : STRBF_A))
+    ctx->f |= STRBF_WANTIN;
+  if ((op&STRBF_C) && op&(op&STRBF_I ? STRBF_A : STRBF_T))
+    ctx->f |= STRBF_WANTOUT;
+
+  /* Determine whether the keystream is engaged, and how it fits in. */
+  if (op&STRBF_C) {
+    ctx->f |= STRBF_CRYPTO;
+    if ((op&(STRBF_I | STRBF_T)) != STRBF_T) ctx->f |= STRBF_MIXOUT;
+  }
+
+  /* Determine whether the output is supposed to be all-bytes-zero. */
+  if ((op&(STRBF_I | STRBF_A | STRBF_T)) == (STRBF_I | STRBF_T))
+    ctx->f |= STRBF_VRFOUT;
+
+  /* The operation is now underway. */
+  ctx->f |= STRBF_ACTIVE;
+}
+
+/* --- @strobe_process@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *             @const void *src@ = pointer to input data, or null
+ *             @void *dest@ = pointer to output data, or null
+ *             @size_t sz@ = common buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                Process data through the active STROBE operation.  The exact
+ *             behaviour depends on the flags passed to @strobe_begin@; see
+ *             that function for details.  If @src@ is null, then the
+ *             behaviour is as if the input consists of @sz@ zero bytes.  If
+ *             @dest@ in null, then the output is discarded.
+ */
+
+void strobe_process(strobe_ctx *ctx, const void *src, void *dest, size_t sz)
+{
+  const octet *p = src; octet *q = dest;
+  unsigned spare;
+
+  /* Make sure that things are set up properly. */
+  assert(ctx->f&STRBF_ACTIVE);
+  if (!(ctx->f&STRBF_WANTIN)) assert(!src);
+  if (!(ctx->f&STRBF_WANTOUT)) assert(!dest);
+
+  /* Work through the input. */
+  spare = ctx->r - ctx->n - 2;
+  if (sz < spare)
+    { process_buffer(ctx, p, q, sz); return; }
+  if (ctx->n) {
+    process_buffer(ctx, p, q, spare); crank(ctx);
+    if (p) { p += spare; }
+    if (q) { q += spare; }
+    sz -= spare;
+  }
+
+  while (sz >= ctx->r - 2) {
+    process_buffer(ctx, p, q, ctx->r - 2); crank(ctx);
+    if (p) { p += ctx->r - 2; }
+    if (q) { q += ctx->r - 2; }
+    sz -= ctx->r - 2;
+  }
+  if (sz) process_buffer(ctx, p, q, sz);
+}
+
+/* --- @strobe_done@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *
+ * Returns:    Zero on success; @-1@ on verification failure (if @I@ and @T@
+ *                     are set and @A@ is clear)
+ *
+ * Use:                Concludes a STROBE operation, returning the result.
+ */
+
+int strobe_done(strobe_ctx *ctx)
+{
+  assert(ctx->f&STRBF_ACTIVE); ctx->f &= ~STRBF_ACTIVE;
+  if (ctx->f&STRBF_VRFOUT) return (-(int)((ctx->f/STRBF_NZERO)&1u));
+  else return (0);
+}
+
+/* --- @strobe_key@, @strobe_ad@, @strobe_@prf@, @strobe_clrout@,
+ *     @strobe_clrin@, @strobe_encout@, @strobe_encin@, @strobe_macout@,
+ *     @strobe_macin@, @strobe_ratchet@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *
+ * Returns:    @strobe_macin@ returns zero on success, or @-1@ on
+ *                     verification failure
+ *
+ * Use:                Perform a STROBE operation on a single buffer.
+ */
+
+static int op(strobe_ctx *ctx, unsigned f0, unsigned f1,
+             const void *src, void *dest, size_t sz)
+{
+  assert(!(f1&~STRBF_M));
+
+  strobe_begin(ctx, f0 | f1);
+  strobe_process(ctx, src, dest, sz);
+  return (strobe_done(ctx));
+}
+
+void strobe_key(strobe_ctx *ctx, unsigned f, const void *k, size_t sz)
+  { op(ctx, STROBE_KEY, f, k, 0, sz); }
+
+void strobe_ad(strobe_ctx *ctx, unsigned f, const void *h, size_t sz)
+  { op(ctx, STROBE_AD, f, h, 0, sz); }
+
+void strobe_prf(strobe_ctx *ctx, unsigned f, void *t, size_t sz)
+  { op(ctx, STROBE_PRF, f, 0, t, sz); }
+
+void strobe_clrout(strobe_ctx *ctx, unsigned f, const void *m, size_t sz)
+  { op(ctx, STROBE_CLROUT, f, m, 0, sz); }
+
+void strobe_clrin(strobe_ctx *ctx, unsigned f, const void *m, size_t sz)
+  { op(ctx, STROBE_CLRIN, f, m, 0, sz); }
+
+void strobe_encout(strobe_ctx *ctx, unsigned f,
+                  const void *m, void *c, size_t sz)
+  { op(ctx, STROBE_ENCOUT, f, m, c, sz); }
+
+void strobe_encin(strobe_ctx *ctx, unsigned f,
+                 const void *c, void *m, size_t sz)
+  { op(ctx, STROBE_ENCIN, f, c, m, sz); }
+
+void strobe_macout(strobe_ctx *ctx, unsigned f, void *t, size_t sz)
+  { op(ctx, STROBE_MACOUT, f, 0, t, sz); }
+
+int strobe_macin(strobe_ctx *ctx, unsigned f, const void *t, size_t sz)
+  { return (op(ctx, STROBE_MACIN, f, t, 0, sz)); }
+
+void strobe_ratchet(strobe_ctx *ctx, unsigned f, size_t sz)
+  { op(ctx, STROBE_RATCHET, f, 0, 0, sz); }
+
+/*----- Test rig ----------------------------------------------------------*/
+
+#ifdef TEST_RIG
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <mLib/hex.h>
+#include <mLib/testrig.h>
+
+#define NSTATE 16
+
+static strobe_ctx states[NSTATE];
+
+static void dump(int rc, char win, const void *p, size_t sz)
+{
+  dstr d = DSTR_INIT;
+  const char *q = p;
+  size_t i;
+  codec *hex;
+  int printable;
+
+  if (!p) {
+    if (!rc) putchar(win);
+    else putchar('-');
+  } else {
+    for (i = 0, printable = 1; i < sz; i++)
+      if (!isprint((unsigned char)q[i])) { printable = 0; break; }
+    if (printable)
+      printf("`%s'", q);
+    else {
+      hex = hex_class.encoder(CDCF_LOWERC, 0, 0);
+      hex->ops->code(hex, p, sz, &d);
+      dstr_write(&d, stdout);
+      hex->ops->destroy(hex);
+    }
+  }
+  dstr_destroy(&d);
+  putchar('\n');
+}
+
+typedef int opfunc(strobe_ctx *, unsigned, const void *, void *, size_t);
+
+static int op_init(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_init(ctx, sz); return (0); }
+
+static int op_copy(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { *ctx = states[sz]; return (0); }
+
+static int op_begin(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_begin(ctx, f); return (0); }
+
+static int op_process(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_process(ctx, p, q, sz); return (0); }
+
+static int op_done(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { return (strobe_done(ctx)); }
+
+static int op_key(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_key(ctx, f, p, sz); return (0); }
+
+static int op_ad(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_ad(ctx, f, p, sz); return (0); }
+
+static int op_prf(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_prf(ctx, f, q, sz); return (0); }
+
+static int op_clrout(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_clrout(ctx, f, p, sz); return (0); }
+
+static int op_clrin(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_clrin(ctx, f, p, sz); return (0); }
+
+static int op_encout(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_encout(ctx, f, p, q, sz); return (0); }
+
+static int op_encin(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_encin(ctx, f, p, q, sz); return (0); }
+
+static int op_macout(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { strobe_macout(ctx, f, q, sz); return (0); }
+
+static int op_macin(strobe_ctx *ctx, unsigned f,
+                  const void *p, void *q, size_t sz)
+  { return (strobe_macin(ctx, f, p, sz)); }
+
+static int op_ratchet(strobe_ctx *ctx, unsigned f,
+                     const void *p, void *q, size_t sz)
+  { strobe_ratchet(ctx, f, sz); return (0); }
+
+static const struct optab {
+  const char *name;
+  opfunc *op;
+} optab[] = {
+#define OP(op) { #op, op_##op }
+  OP(init), OP(copy),
+  OP(begin), OP(process), OP(done),
+  OP(key), OP(ad), OP(prf),
+  OP(clrout), OP(clrin),
+  OP(encout), OP(encin),
+  OP(macout), OP(macin),
+  OP(ratchet),
+  { 0 }
+#undef OP
+};
+
+static int verify(dstr v[])
+{
+  int r;
+  strobe_ctx *ctx;
+  const char *p;
+  char *q;
+  const struct optab *op;
+  dstr d0 = DSTR_INIT, d1 = DSTR_INIT;
+  codec *hex;
+  unsigned f;
+  const void *src, *destref;
+  void *dest;
+  size_t sz;
+  int rc, rcref;
+  int ok;
+
+  /* First, get the register number. */
+  r = *(int *)v[0].buf; ctx = &states[r];
+
+  /* Next job is to parse the command and flags. */
+  q = v[1].buf; p = q; q += strcspn(q, "/"); if (*q) *q++ = 0;
+  for (op = optab; op->name; op++)
+    if (!strcmp(op->name, p)) goto found_op;
+  abort();
+found_op:
+
+  f = 0;
+  for (p = q; *p; p++) {
+    switch (*p) {
+      case 'I': f |= STRBF_I; break;
+      case 'C': f |= STRBF_C; break;
+      case 'A': f |= STRBF_A; break;
+      case 'T': f |= STRBF_T; break;
+      case 'M': f |= STRBF_M; break;
+      default: abort();
+    }
+  }
+
+  /* Convert the source parameter. */
+  p = v[2].buf;
+  if (*p == '*')
+    { src = 0; sz = strtoul(p + 1, 0, 0); }
+  else if (*p == '=')
+    { src = p + 1; sz = v[2].len - 1; }
+  else if (*p == '!') {
+    hex = hex_class.decoder(CDCF_IGNCASE);
+    rc = hex->ops->code(hex, p + 1, v[2].len - 1, &d0); assert(!rc);
+    src = d0.buf; sz = d0.len;
+    hex->ops->destroy(hex);
+  } else
+    abort();
+
+  /* Convert the destination parameter. */
+  p = v[3].buf;
+  if (*p == '+')
+    { destref = 0; rcref = 0; assert(v[3].len == 1); }
+  else if (*p == '-')
+    { destref = 0; rcref = -1; assert(v[3].len == 1); }
+  else if (*p == '=')
+    { destref = p + 1; assert(sz == v[3].len - 1); rcref = 0; }
+  else if (*p == '!') {
+    hex = hex_class.decoder(CDCF_IGNCASE);
+    rc = hex->ops->code(hex, p + 1, v[3].len - 1, &d1); assert(!rc);
+    destref = d1.buf; assert(sz == d1.len);
+    hex->ops->destroy(hex);
+    rcref = 0;
+  } else
+    abort();
+  if (!destref) dest = 0;
+  else dest = xmalloc(sz);
+
+  /* Do the operation. */
+  rc = op->op(ctx, f, src, dest, sz);
+
+  /* Check we got the right answer. */
+  ok = (rc == rcref && (!destref || !memcmp(dest, destref, sz)));
+  if (!ok) {
+    printf("failed test\n");
+    printf("       state = %d\n", r);
+    printf("   operation = %s%s%s%s%s%s%s\n",
+          op->name,
+          f ? "/" : "",
+          f&STRBF_I ? "I" : "",
+          f&STRBF_A ? "A" : "",
+          f&STRBF_C ? "C" : "",
+          f&STRBF_T ? "T" : "",
+          f&STRBF_M ? "M" : "");
+    printf("       input = "); dump(0, '*', src, sz);
+    printf("    computed = "); dump(rc, '+', dest, sz);
+    printf("    expected = "); dump(rcref, '+', destref, sz);
+  }
+
+  dstr_destroy(&d0);
+  dstr_destroy(&d1);
+  free(dest);
+  return (ok);
+}
+
+static test_chunk tests[] = {
+  { "strobe", verify,
+    { &type_int, &type_string, &type_string, &type_string, 0 } },
+  { 0, 0, { 0 } }
+};
+
+int main(int argc, char *argv[])
+{
+  test_run(argc, argv, tests, SRCDIR "/t/strobe");
+  return (0);
+}
+
+#endif
+
+/*----- That's all, folks -------------------------------------------------*/
diff --git a/symm/strobe.h b/symm/strobe.h
new file mode 100644 (file)
index 0000000..c53fc39
--- /dev/null
@@ -0,0 +1,233 @@
+/* -*-c-*-
+ *
+ * The STROBE protocol framework
+ *
+ * (c) 2018 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.
+ */
+
+/*----- Notes on the STROBE framework -------------------------------------*
+ *
+ * Mike Hamburg's STROBE framework is an attempt to do pretty much all the
+ * obvious parts of symmetric cryptography using a single primitive: the
+ * Keccak-p[1600, 24] sponge function which underlies the SHA3.  This works
+ * excellently on tiny devices, because it's possible to implement
+ * Keccak-p[1600, 24] with a very small amount of code, and STROBE requires
+ * minimal additional state beyond the 200-byte Keccak-p[1600, n] state,
+ * which can be updated more-or-less in place.
+ *
+ * STROBE is stateful.  The idea is that the two parties' STROBE states
+ * should evolve in lockstep with each other.  This will obviously go wrong
+ * if messages cross over, or are reordered or duplicated.
+ *
+ * The model for a single STROBE-based endpoint consists of the application,
+ * and a transport for communicating with a peer.  All data gets mixed into
+ * the STROBE state.  Some operations mix input data with a keystream
+ * generated by the sponge function (used in duplexing mode), which can then
+ * be used to encrypt and authenticate messages.
+ */
+
+#ifndef CATACOMB_STROBE_H
+#define CATACOMB_STROBE_H
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+/*----- Header files ------------------------------------------------------*/
+
+#include <mLib/bits.h>
+
+#ifndef CATACOMB_KECCAK1600_H
+#  include "keccak1600.h"
+#endif
+
+/*----- Data structures ---------------------------------------------------*/
+
+#define STRBF_I 0x01                   /* inbound */
+#define STRBF_A 0x02                   /* application */
+#define STRBF_C 0x04                   /* cipher */
+#define STRBF_T 0x08                   /* transport */
+#define STRBF_M 0x10                   /* metadata */
+#define STRBF_K 0x20                   /* key-tree (not implemented) */
+#define STRBF_VALIDMASK 0x1f           /* valid bits */
+#define STRBF_OPMASK 0xff              /* observable operation bits */
+
+typedef struct strobe_ctx {
+  keccak1600_state k;
+  octet buf[200];
+  unsigned f, r, n0, n;
+#define STRBF_I0 0x0001                        /* initiator/responder role */
+#define STRBF_INIT 0x0100              /* initiator/responder role set? */
+#define STRBF_STMASK 0x01ff            /* mask for persistent state bits */
+#define STRBF_ACTIVE 0x0200            /* operation in progress */
+#define STRBF_WANTIN 0x0400            /* expect input buffer */
+#define STRBF_WANTOUT 0x0800           /* expect output buffer */
+#define STRBF_VRFOUT 0x1000            /* verify that output is nonzero */
+#define STRBF_NZERO 0x2000             /* nonzero output from update */
+#define STRBF_MIXOUT 0x4000            /* mix output into state */
+#define STRBF_CRYPTO 0x8000            /* mix sponge state into output */
+} strobe_ctx;
+
+#define STROBE_KEY               (STRBF_A | STRBF_C)
+#define STROBE_AD                (STRBF_A)
+#define STROBE_PRF     (STRBF_I | STRBF_A | STRBF_C)
+#define STROBE_CLROUT            (STRBF_A |           STRBF_T)
+#define STROBE_CLRIN   (STRBF_I | STRBF_A |           STRBF_T)
+#define STROBE_ENCOUT            (STRBF_A | STRBF_C | STRBF_T)
+#define STROBE_ENCIN   (STRBF_I | STRBF_A | STRBF_C | STRBF_T)
+#define STROBE_MACOUT                      (STRBF_C | STRBF_T)
+#define STROBE_MACIN   (STRBF_I |           STRBF_C | STRBF_T)
+#define STROBE_RATCHET                     (STRBF_C)
+
+#define STROBE_ROLEMASK        (STRBF_I0 | STRBF_INIT)
+#define STRBRL_UNDCD   (0)                     /* undecided */
+#define STRBRL_INIT               (STRBF_INIT) /* initiator */
+#define STRBRL_RESP    (STRBF_I0 | STRBF_INIT) /* responder */
+
+/*----- Functions provided ------------------------------------------------*/
+
+/* --- @strobe_init@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block to initialize
+ *             @unsigned lambda@ = security parameter, in bits (must be a
+ *                     multiple of 32)
+ *
+ * Returns:    ---
+ *
+ * Use:                Initialize a STROBE context for use.
+ */
+
+extern void strobe_init(strobe_ctx */*ctx*/, unsigned /*lambda*/);
+
+/* --- @strobe_begin@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *             @unsigned op@ = bitmask of flags
+ *
+ * Returns:    ---
+ *
+ * Use:                Begin a STROBE operation.  The flags determine the behaviour
+ *             of the @strobe_process@ and @strobe_done@ functions.
+ *
+ *               * The @I@ bit determines the primary direction of data
+ *                 movement.  If it's clear, data comes from the application
+ *                 into STROBE.  If it's set, data comes from STROBE towards
+ *                 the application.
+ *
+ *               * The @C@ bit activates cryptographic processing.  If it's
+ *                 clear, then the input and output data would be equal, so
+ *                 @dest@ must be null.  If it's set, then input data is
+ *                 XORed with the keystream on its way to the output.
+ *
+ *               * The @A@ bit determines whether the application is
+ *                 engaged.  If it's set, then the input or output buffer
+ *                 (according to whether @I@ is clear or set, respectively)
+ *                 holds the application data.  If it's clear, and @I@ is
+ *                 clear, then zero bytes are fed in; if @I@ is set, then
+ *                 the output is compared with zero, and @strobe_done@
+ *                 reports the outcome of this comparison.
+ *
+ *               * The @T@ bit determines whether the transport is engaged.
+ *                 If it's set, then the input or output buffer (according
+ *                 to whether @I@ is set or clear, respectively) holds
+ *                 transport data.  If it's clear, and @I@ is set, then zero
+ *                 bytes are fed in; if @I@ is clear, then the output is
+ *                 discarded.
+ *
+ *               * The @M@ bit marks the data as metadata, but has no other
+ *                 effect.
+ */
+
+extern void strobe_begin(strobe_ctx */*ctx*/, unsigned /*op*/);
+
+/* --- @strobe_process@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *             @const void *src@ = pointer to input data, or null
+ *             @void *dest@ = pointer to output data, or null
+ *             @size_t sz@ = common buffer length
+ *
+ * Returns:    ---
+ *
+ * Use:                Process data through the active STROBE operation.  The exact
+ *             behaviour depends on the flags passed to @strobe_begin@; see
+ *             that function for details.  If @src@ is null, then the
+ *             behaviour is as if the input consists of @sz@ zero bytes.  If
+ *             @dest@ in null, then the output is discarded.
+ */
+
+extern void strobe_process(strobe_ctx */*ctx*/, const void */*src*/,
+                          void */*dest*/, size_t /*sz*/);
+
+/* --- @strobe_done@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *
+ * Returns:    Zero on success; @-1@ on verification failure (if @I@ and @T@
+ *                     are set and @A@ is clear)
+ *
+ * Use:                Concludes a STROBE operation, returning the result.
+ */
+
+extern int strobe_done(strobe_ctx */*ctx*/);
+
+/* --- @strobe_key@, @strobe_ad@, @strobe_@prf@, @strobe_clrout@,
+ *     @strobe_clrin@, @strobe_encout@, @strobe_encin@, @strobe_macout@,
+ *     @strobe_macin@, @strobe_ratchet@ --- *
+ *
+ * Arguments:  @strobe_ctx *ctx@ = pointer to context block
+ *
+ * Returns:    @strobe_macin@ returns zero on success, or @-1@ on
+ *                     verification failure
+ *
+ * Use:                Perform a STROBE operation on a single buffer.
+ */
+
+extern void strobe_key(strobe_ctx */*ctx*/, unsigned /*f*/,
+                      const void */*k*/, size_t /*sz*/);
+extern void strobe_ad(strobe_ctx */*ctx*/, unsigned /*f*/,
+                     const void */*h*/, size_t /*sz*/);
+extern void strobe_prf(strobe_ctx */*ctx*/, unsigned /*f*/,
+                      void */*t*/, size_t /*sz*/);
+extern void strobe_clrout(strobe_ctx */*ctx*/, unsigned /*f*/,
+                         const void */*m*/, size_t /*sz*/);
+extern void strobe_clrin(strobe_ctx */*ctx*/, unsigned /*f*/,
+                        const void */*m*/, size_t /*sz*/);
+extern void strobe_encout(strobe_ctx */*ctx*/, unsigned /*f*/,
+                         const void */*m*/, void */*c*/, size_t /*sz*/);
+extern void strobe_encin(strobe_ctx */*ctx*/, unsigned /*f*/,
+                        const void */*c*/, void */*m*/, size_t /*sz*/);
+extern void strobe_macout(strobe_ctx */*ctx*/, unsigned /*f*/,
+                         void */*t*/, size_t /*sz*/);
+extern int strobe_macin(strobe_ctx */*ctx*/, unsigned /*f*/,
+                       const void */*t*/, size_t /*sz*/);
+extern void strobe_ratchet(strobe_ctx */*ctx*/, unsigned /*f*/,
+                          size_t /*sz*/);
+
+/*----- That's all, folks -------------------------------------------------*/
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
diff --git a/symm/t/strobe b/symm/t/strobe
new file mode 100644 (file)
index 0000000..1d05675
--- /dev/null
@@ -0,0 +1,1288 @@
+### Test vectors for STROBE.
+
+strobe {
+  ## This is the `Concurrence' test from Hamburg's reference implementation.
+
+  ## Initial conversation.
+  0 init *128 +;                       1 init *128 +;
+  0 ad/M =testing +;                   1 ad/M =testing +;
+  0 prf *10 !8a13a189683bf5678170;     1 prf *10 !8a13a189683bf5678170;
+  0 ad =Hello +;                       1 ad =Hello +;
+  0 encout =World !123bfbee34;         1 encin !123bfbee34 =World;
+  0 clrout =foo +;                     1 clrin =foo +;
+  0 clrin =bar +;                      1 clrout =bar +;
+  0 encin =baz !15e518;                        1 encout !15e518 =baz;
+
+  ## Lots of `X's.
+  0 encout
+       =
+       !;
+  1 encin
+       !
+       =;
+  0 encout
+       =X
+       !c6;
+  1 encin
+       !c6
+       =X;
+  0 encout
+       =XX
+       !1016;
+  1 encin
+       !1016
+       =XX;
+  0 encout
+       =XXX
+       !8ba0e8;
+  1 encin
+       !8ba0e8
+       =XXX;
+  0 encout
+       =XXXX
+       !4990e91f;
+  1 encin
+       !4990e91f
+       =XXXX;
+  0 encout
+       =XXXXX
+       !5eec19edd5;
+  1 encin
+       !5eec19edd5
+       =XXXXX;
+  0 encout
+       =XXXXXX
+       !dc06c47954a4;
+  1 encin
+       !dc06c47954a4
+       =XXXXXX;
+  0 encout
+       =XXXXXXX
+       !9a4b7ade0aa89e;
+  1 encin
+       !9a4b7ade0aa89e
+       =XXXXXXX;
+  0 encout
+       =XXXXXXXX
+       !0d1b71cf776af3a9;
+  1 encin
+       !0d1b71cf776af3a9
+       =XXXXXXXX;
+  0 encout
+       =XXXXXXXXX
+       !fa037bf1c020190bbc;
+  1 encin
+       !fa037bf1c020190bbc
+       =XXXXXXXXX;
+  0 encout
+       =XXXXXXXXXX
+       !a66e9933c1cdcf5fc084;
+  1 encin
+       !a66e9933c1cdcf5fc084
+       =XXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXX
+       !561f708ef060b436728811;
+  1 encin
+       !561f708ef060b436728811
+       =XXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXX
+       !12fe9d8b24b91b434ec114ab;
+  1 encin
+       !12fe9d8b24b91b434ec114ab
+       =XXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXX
+       !9a516cf12e38944e370864e0f8;
+  1 encin
+       !9a516cf12e38944e370864e0f8
+       =XXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXX
+       !9155393fc1155502250c839e3758;
+  1 encin
+       !9155393fc1155502250c839e3758
+       =XXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXX
+       !9731d438dd00d5de2a3bb21a6a14e3;
+  1 encin
+       !9731d438dd00d5de2a3bb21a6a14e3
+       =XXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXX
+       !41c74574fe9efce9225aa766a83d4f42;
+  1 encin
+       !41c74574fe9efce9225aa766a83d4f42
+       =XXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXX
+       !65d720eafbb3261f0d960d70c35dcaea20;
+  1 encin
+       !65d720eafbb3261f0d960d70c35dcaea20
+       =XXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXX
+       !703a1db79e5b68de3760c58f90fa6775f455;
+  1 encin
+       !703a1db79e5b68de3760c58f90fa6775f455
+       =XXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXX
+       !b47759d2263e7d97760a4461a0d04e7fd56f6e;
+  1 encin
+       !b47759d2263e7d97760a4461a0d04e7fd56f6e
+       =XXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXX
+       !3869204c64230931d7c2e5647dd67e2800db2039;
+  1 encin
+       !3869204c64230931d7c2e5647dd67e2800db2039
+       =XXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXX
+       !4aa5d694e8006d83f87cfc62408b6127b77e47bdd7;
+  1 encin
+       !4aa5d694e8006d83f87cfc62408b6127b77e47bdd7
+       =XXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXX
+       !1f1e7cee02468524a853c1c1b53d561443d89b19d536;
+  1 encin
+       !1f1e7cee02468524a853c1c1b53d561443d89b19d536
+       =XXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXX
+       !7c3fc5d277be9e4525d80442d49d21536fc460a7317f0e;
+  1 encin
+       !7c3fc5d277be9e4525d80442d49d21536fc460a7317f0e
+       =XXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXX
+       !fd2f4cf48128e3a4d20d1ffedb7e1629ba80e89e55b1d343;
+  1 encin
+       !fd2f4cf48128e3a4d20d1ffedb7e1629ba80e89e55b1d343
+       =XXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXX
+       !c85c1eb7626b48b96ebb245822a54dc95a6d96cb6a2af76c3c;
+  1 encin
+       !c85c1eb7626b48b96ebb245822a54dc95a6d96cb6a2af76c3c
+       =XXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1b3a6f13c1741e91fad9a060ba3f144e356a7c8e5bf6ea982d84;
+  1 encin
+       !1b3a6f13c1741e91fad9a060ba3f144e356a7c8e5bf6ea982d84
+       =XXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a979bb3b94687d0d60c55dbc071668da261bfa6f37f91a2d194115;
+  1 encin
+       !a979bb3b94687d0d60c55dbc071668da261bfa6f37f91a2d194115
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1e2a52e3220403c77bbb0e6e2b9456fcb918d5a0dfc04eef76fc9278;
+  1 encin
+       !1e2a52e3220403c77bbb0e6e2b9456fcb918d5a0dfc04eef76fc9278
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1f34cc349d503817d28fc1a67b8dd54a4082ae73d8d4f004279bd7ce63;
+  1 encin
+       !1f34cc349d503817d28fc1a67b8dd54a4082ae73d8d4f004279bd7ce63
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !f7c6bdf8689f0cd920c8ff6745b3fc285decc5a73180841baec2008b72ae;
+  1 encin
+       !f7c6bdf8689f0cd920c8ff6745b3fc285decc5a73180841baec2008b72ae
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !89bca3b3fe374d7776fca1568c67972791638e6004e37fc3b792388fbf4d94;
+  1 encin
+       !89bca3b3fe374d7776fca1568c67972791638e6004e37fc3b792388fbf4d94
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d752309a5e5ebe2c591c55b9b42c1aebc3a5d17bb696bd5e5fece6d70cd4a076;
+  1 encin
+       !d752309a5e5ebe2c591c55b9b42c1aebc3a5d17bb696bd5e5fece6d70cd4a076
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e6f0b8800dbee31e5a9b1487e186ae7e5839becfbe8572afe8a907803b6298ce47;
+  1 encin
+       !e6f0b8800dbee31e5a9b1487e186ae7e5839becfbe8572afe8a907803b6298ce47
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ea5e143b8a616211700347b46bda10ebd200ebad8cb747bee6ebbd2044bcbbe88767;
+  1 encin
+       !ea5e143b8a616211700347b46bda10ebd200ebad8cb747bee6ebbd2044bcbbe88767
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c88d7a83b618b4a3bbaf5cdcd9bfb77b8593163e29b656de06aad9dcba67f1090894a8;
+  1 encin
+       !c88d7a83b618b4a3bbaf5cdcd9bfb77b8593163e29b656de06aad9dcba67f1090894a8
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !13343f85d5c33de49ebab48d9ea012ec6bee78fe997b9d465220b267ce527df63963920c;
+  1 encin
+       !13343f85d5c33de49ebab48d9ea012ec6bee78fe997b9d465220b267ce527df63963920c
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !0772dfb3e97ffe9897e254e183ed6a339e14b6f6ce98579cbd74b0dd12705f0e8fc83a22f1;
+  1 encin
+       !0772dfb3e97ffe9897e254e183ed6a339e14b6f6ce98579cbd74b0dd12705f0e8fc83a22f1
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e666998f161d9d5cd8a4b84b8f69c7f242843a7d70a368e0012aebb31f3455c8db0a2762d56e;
+  1 encin
+       !e666998f161d9d5cd8a4b84b8f69c7f242843a7d70a368e0012aebb31f3455c8db0a2762d56e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a617e710a24d8ec6e8d0643913558d03c979dff5adb4807a1bb676c54abc271e478e3cd26441f5;
+  1 encin
+       !a617e710a24d8ec6e8d0643913558d03c979dff5adb4807a1bb676c54abc271e478e3cd26441f5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4ac10a6382eb48c30b8f3532c5d2bd6aa01258713c8048843f2f01aeb07ec9673ee23c12ebbc496c;
+  1 encin
+       !4ac10a6382eb48c30b8f3532c5d2bd6aa01258713c8048843f2f01aeb07ec9673ee23c12ebbc496c
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !3a14815a68d3156dbb049088b1c3cac707e1fe98d6f6c2ef702507b73d36341539f5bf3ec179c459fd;
+  1 encin
+       !3a14815a68d3156dbb049088b1c3cac707e1fe98d6f6c2ef702507b73d36341539f5bf3ec179c459fd
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c5e4de01206e6d22e1b688ee16cf70722800c67acdf9b33ea0e4c4bb9abf57c29212a4b5037cead2d56b;
+  1 encin
+       !c5e4de01206e6d22e1b688ee16cf70722800c67acdf9b33ea0e4c4bb9abf57c29212a4b5037cead2d56b
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ef4c23d94151559c878ed774c21e343cb401494331bb90471146f6b9dfa754f29220fe979712c045f279cf;
+  1 encin
+       !ef4c23d94151559c878ed774c21e343cb401494331bb90471146f6b9dfa754f29220fe979712c045f279cf
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1d5e809ca195882a69bf0a3ceb7cab559cdaa31f10bbfb4c52350d921a6d00cc6432730fe329ba59fb40ee9b;
+  1 encin
+       !1d5e809ca195882a69bf0a3ceb7cab559cdaa31f10bbfb4c52350d921a6d00cc6432730fe329ba59fb40ee9b
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !0ce3268ba95b6a6ff86e8c9f2258ac6464b6c1dd6ada24a3003cfd91f54c930c08a440fae376197d5b021cbe2e;
+  1 encin
+       !0ce3268ba95b6a6ff86e8c9f2258ac6464b6c1dd6ada24a3003cfd91f54c930c08a440fae376197d5b021cbe2e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !522fb018a04f385658fd390f4c2543454c872ce4ba8d6fed4aee361e896875ca34f393a9a5472464a3bcf01e9853;
+  1 encin
+       !522fb018a04f385658fd390f4c2543454c872ce4ba8d6fed4aee361e896875ca34f393a9a5472464a3bcf01e9853
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7f25149deb31470c801e70671e08ed3a370342fb15bb99d17b58943c5bf9c1e4eeebf0b8aaa4f30679be9a06bb8923;
+  1 encin
+       !7f25149deb31470c801e70671e08ed3a370342fb15bb99d17b58943c5bf9c1e4eeebf0b8aaa4f30679be9a06bb8923
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !3f4a8395e2d690bb34b1bdcfb36c2c52079d5d66b4fcb6548da98d492da04db0d90500a4ef5c4f9e9feb55ee42154ad9;
+  1 encin
+       !3f4a8395e2d690bb34b1bdcfb36c2c52079d5d66b4fcb6548da98d492da04db0d90500a4ef5c4f9e9feb55ee42154ad9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !b0f391bda49d977c52f80f8675e84e9b014f7503bb3825c25da1b5169af498e96dc9440cae6b516325efdee35689abbad9;
+  1 encin
+       !b0f391bda49d977c52f80f8675e84e9b014f7503bb3825c25da1b5169af498e96dc9440cae6b516325efdee35689abbad9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2812c84a8d5c2fb938292308e711d64bff30ea0c6419e3433eb43be48646fe8b29f3864cb06cd0a3cc70b38cdea4fa6d099d;
+  1 encin
+       !2812c84a8d5c2fb938292308e711d64bff30ea0c6419e3433eb43be48646fe8b29f3864cb06cd0a3cc70b38cdea4fa6d099d
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !9f2d627361db4aab97458fda8cdc703ed90dad1f3d6d524c6dae99729194effd0a1f394c30271d9ddf28c04cca1b391b0bb660;
+  1 encin
+       !9f2d627361db4aab97458fda8cdc703ed90dad1f3d6d524c6dae99729194effd0a1f394c30271d9ddf28c04cca1b391b0bb660
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d90fd5180555d5694fb8d37ae3b14a16522f0975dfedf194d7fb982f78739e5c18ec96683d36e7ea87e95f9b6032af286cfc87b9;
+  1 encin
+       !d90fd5180555d5694fb8d37ae3b14a16522f0975dfedf194d7fb982f78739e5c18ec96683d36e7ea87e95f9b6032af286cfc87b9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !9f68b8e0fbabaa3ba7e89f01ce4ee4a303a0d5b70a4cf86e248fd0818b197e2a11fa48eacbac441e555f9c334ad08d01826e832362;
+  1 encin
+       !9f68b8e0fbabaa3ba7e89f01ce4ee4a303a0d5b70a4cf86e248fd0818b197e2a11fa48eacbac441e555f9c334ad08d01826e832362
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !5eda3e402fb41bcd18f967777257f3bc57df8a46899110accff5cd918faaa0e6d50879e32dd185978ff379120fccfda4d4a8fdd4af64;
+  1 encin
+       !5eda3e402fb41bcd18f967777257f3bc57df8a46899110accff5cd918faaa0e6d50879e32dd185978ff379120fccfda4d4a8fdd4af64
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !217f1002e3606276bc24ef3441adba9b103aa61c009157ff65c88925d7bc6ffa76860af8ca8e809de0650f560f5fef195697086774a509;
+  1 encin
+       !217f1002e3606276bc24ef3441adba9b103aa61c009157ff65c88925d7bc6ffa76860af8ca8e809de0650f560f5fef195697086774a509
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1a27632ac0e6dc87d3d9b752e104fae2e97962129829c68d921a01880ddae68eaf1c4cf514cfc1be573acb9704483c8052f263daba49c5c1;
+  1 encin
+       !1a27632ac0e6dc87d3d9b752e104fae2e97962129829c68d921a01880ddae68eaf1c4cf514cfc1be573acb9704483c8052f263daba49c5c1
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !63ee36be37b62458e10f5a1014bec7168ee9925e290f232484aedee47e99c55168eb25fd677e83b2dfd8b74fbea276c17efe71cef67932e7fa;
+  1 encin
+       !63ee36be37b62458e10f5a1014bec7168ee9925e290f232484aedee47e99c55168eb25fd677e83b2dfd8b74fbea276c17efe71cef67932e7fa
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !aa17985c6558bbb41d8bdcfbcdbfedb0c495c2f1795be87902defeb3eaf329cca4210047084f9664f7bba72dfafc3ac277d465ccad618af29090;
+  1 encin
+       !aa17985c6558bbb41d8bdcfbcdbfedb0c495c2f1795be87902defeb3eaf329cca4210047084f9664f7bba72dfafc3ac277d465ccad618af29090
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !cb6c34e2718c39a14da69b7edcb2b9eb341036cf37b74109b920b02426d216bd137387cf79c904233da683b0e2d95497e62b0e5456095de8b7adb1;
+  1 encin
+       !cb6c34e2718c39a14da69b7edcb2b9eb341036cf37b74109b920b02426d216bd137387cf79c904233da683b0e2d95497e62b0e5456095de8b7adb1
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !8920633abb5e90a51bd6da58a196e932647695b2ac3fa83d5a4a156f95c1cd506aab3c655f2b2b11c9434292529a0dfb6c5f1b5db33de9e3019f98aa;
+  1 encin
+       !8920633abb5e90a51bd6da58a196e932647695b2ac3fa83d5a4a156f95c1cd506aab3c655f2b2b11c9434292529a0dfb6c5f1b5db33de9e3019f98aa
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !87df0d097ff3bcb1c875d39bb45138c7bec2b033209dadbb205655b28bcce6353f802b15b81642919f40f7601c36703266fbd07163e7da933d4f2bb9d4;
+  1 encin
+       !87df0d097ff3bcb1c875d39bb45138c7bec2b033209dadbb205655b28bcce6353f802b15b81642919f40f7601c36703266fbd07163e7da933d4f2bb9d4
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !dbbb5a6d715a0504eb85597f07a74c7df63a2f497a45f523ba37a01134993fcbd08b4c3ee88c540c640728864f79b3011fb8f07c20da16453d3d7bc0ad62;
+  1 encin
+       !dbbb5a6d715a0504eb85597f07a74c7df63a2f497a45f523ba37a01134993fcbd08b4c3ee88c540c640728864f79b3011fb8f07c20da16453d3d7bc0ad62
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !bba81430187038b681b56b17148f96ac219a2b474c29ea1d362fb97fa3177c6b3aae2a8b35bdf16d4166f2ff35319e60b0770436ed42fd4c72caf90b2e4047;
+  1 encin
+       !bba81430187038b681b56b17148f96ac219a2b474c29ea1d362fb97fa3177c6b3aae2a8b35bdf16d4166f2ff35319e60b0770436ed42fd4c72caf90b2e4047
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !3b341925aa4a4b5930a4280f5c7ac0d8e7aa047e1a55f5ba7803cc57d3685df6d460fc0ab526c5f776a0ebe100907080f9448cf473668c06a4d8724f5bf34aa5;
+  1 encin
+       !3b341925aa4a4b5930a4280f5c7ac0d8e7aa047e1a55f5ba7803cc57d3685df6d460fc0ab526c5f776a0ebe100907080f9448cf473668c06a4d8724f5bf34aa5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !572c5a300ac0105071ed9d80d268a7ff9e71df5e4b7bd4734089368500159222711532393589a776e48f3809e03fa0af9895909220d3c1e477605546bf82388742;
+  1 encin
+       !572c5a300ac0105071ed9d80d268a7ff9e71df5e4b7bd4734089368500159222711532393589a776e48f3809e03fa0af9895909220d3c1e477605546bf82388742
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ad6a3713688e3c8d05bb38ab2115819c2a7a6044e6b532bdb5f5afc199eeeec5530ed464014e82ebbc5ae8cb230438831dd90233cf679e3cd0aa621e82749e00bcbf;
+  1 encin
+       !ad6a3713688e3c8d05bb38ab2115819c2a7a6044e6b532bdb5f5afc199eeeec5530ed464014e82ebbc5ae8cb230438831dd90233cf679e3cd0aa621e82749e00bcbf
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !9ad3396f7edfd8cb0c67701033b2941e32867e9a34288cfbf0b575f4981d96738d7d58f95131652da0947405e6210eca92d4787a9604cedb5113e7820bf2b1f60b338a;
+  1 encin
+       !9ad3396f7edfd8cb0c67701033b2941e32867e9a34288cfbf0b575f4981d96738d7d58f95131652da0947405e6210eca92d4787a9604cedb5113e7820bf2b1f60b338a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !fd7ab45351a569c2215e8645840b3f62cdd02d348d984f848a6aa1971854fe5feaf4253ace1f3a5cd8f9e5caf2ad65572a389f9e09fb09059fa66f37aad370ff6d068a88;
+  1 encin
+       !fd7ab45351a569c2215e8645840b3f62cdd02d348d984f848a6aa1971854fe5feaf4253ace1f3a5cd8f9e5caf2ad65572a389f9e09fb09059fa66f37aad370ff6d068a88
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !38e597770fde2538e66147b517e204e827674c1fc47d51d835fc5f8e9c0de980f6995ab39272791d075ac26d3ef13a4e87ed8491e4610c64ae8102310623cde0ebcc78ba30;
+  1 encin
+       !38e597770fde2538e66147b517e204e827674c1fc47d51d835fc5f8e9c0de980f6995ab39272791d075ac26d3ef13a4e87ed8491e4610c64ae8102310623cde0ebcc78ba30
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !86e78b7d6e0c059f0895d5cb7cfc130523a1738b2d0efb4dacac3a8a10ef768d39f46c18206496cbe0a07ae07bd9ce0e7439f2952ed2ff25ae7d7c9242b7de77515d3a6a0bb3;
+  1 encin
+       !86e78b7d6e0c059f0895d5cb7cfc130523a1738b2d0efb4dacac3a8a10ef768d39f46c18206496cbe0a07ae07bd9ce0e7439f2952ed2ff25ae7d7c9242b7de77515d3a6a0bb3
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !49f36a3342f69941f0c2fbf927b19eb768e8fcbd4dc1050e70146db69e16155964b4da24ec9f5b677ced64cccdb2d50623a2b85bc7f9e2e40f340993ba4d238fe47d4401a345b6;
+  1 encin
+       !49f36a3342f69941f0c2fbf927b19eb768e8fcbd4dc1050e70146db69e16155964b4da24ec9f5b677ced64cccdb2d50623a2b85bc7f9e2e40f340993ba4d238fe47d4401a345b6
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !37256a8d6113eba18fa7e67a2eb2a7d9007099c0f8dad252a7450b2199a9031ff2318140668f623b161877eedd5342e324edb960a9584a680d45ca633adf08b90430c531b132478b;
+  1 encin
+       !37256a8d6113eba18fa7e67a2eb2a7d9007099c0f8dad252a7450b2199a9031ff2318140668f623b161877eedd5342e324edb960a9584a680d45ca633adf08b90430c531b132478b
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !32dca3f2af35c92213a9af62b8c9206742f6c66a3df5148d7b72b967e9ae90d1ba3dc5b5743fce415a57deb51c46f5a133ffe2f83b8acb0f1495f16a702bc644c15377255a75a44039;
+  1 encin
+       !32dca3f2af35c92213a9af62b8c9206742f6c66a3df5148d7b72b967e9ae90d1ba3dc5b5743fce415a57deb51c46f5a133ffe2f83b8acb0f1495f16a702bc644c15377255a75a44039
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !5bc91312769a0b0f43b13813583b56041d376cc7c059f0ba9693287df303d2271f9a81f8467f1b9d2a929ad508b0c08568d2988aa330395660c5a3e10828cb6c06b0a300a3a4789ff756;
+  1 encin
+       !5bc91312769a0b0f43b13813583b56041d376cc7c059f0ba9693287df303d2271f9a81f8467f1b9d2a929ad508b0c08568d2988aa330395660c5a3e10828cb6c06b0a300a3a4789ff756
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !cfcef59edf00d6721c558676ad694b2bc7cdda43564d29da7f58e399a47fe0ad544a2a5c85086a37239b5f2ccabd7472e8a7936d9de9f2252b67d5953b21144f329565b9a4770c8ff4a227;
+  1 encin
+       !cfcef59edf00d6721c558676ad694b2bc7cdda43564d29da7f58e399a47fe0ad544a2a5c85086a37239b5f2ccabd7472e8a7936d9de9f2252b67d5953b21144f329565b9a4770c8ff4a227
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ef849e65f395e85b4396f22602b1aa9fe3726161e6e1d582ebc585c2e6790fce1c0e5f0b616e35e875b9ed5eccef0c945cc8e68be2374d8859576405979f300a18931d9806e6a8a1e99eb66b;
+  1 encin
+       !ef849e65f395e85b4396f22602b1aa9fe3726161e6e1d582ebc585c2e6790fce1c0e5f0b616e35e875b9ed5eccef0c945cc8e68be2374d8859576405979f300a18931d9806e6a8a1e99eb66b
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !bd964b885a27668afe2e0738502b2ba3f11a63181e5cc26fb55223b320bae68e2c04f069d076b0ff5209f6a5b453c059177af54d28ba29bb1dd62edfb8a77dbad75c5b19397062408dd42ea499;
+  1 encin
+       !bd964b885a27668afe2e0738502b2ba3f11a63181e5cc26fb55223b320bae68e2c04f069d076b0ff5209f6a5b453c059177af54d28ba29bb1dd62edfb8a77dbad75c5b19397062408dd42ea499
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !463042317a2a27ba58aaea708b0bfe915a2a2433f89ef1193e04082f06ad3cd7a5bf8920adfc155fcbb8dc91d0473c28ff17b2202baccf8d7ba72c7d622a95a5eaf3a5de9e7b1a55e3d76c98a745;
+  1 encin
+       !463042317a2a27ba58aaea708b0bfe915a2a2433f89ef1193e04082f06ad3cd7a5bf8920adfc155fcbb8dc91d0473c28ff17b2202baccf8d7ba72c7d622a95a5eaf3a5de9e7b1a55e3d76c98a745
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d91972d9c34b73ca5adfdf28c276903d020d856a39569272483a1d333f7c6b72ae1fc94e00e42d62d0c6f93d5d2ded327e19ff8c07e586e5ed9eebd00c55239446500cea3a4ea22c38f4d0e32d8dec;
+  1 encin
+       !d91972d9c34b73ca5adfdf28c276903d020d856a39569272483a1d333f7c6b72ae1fc94e00e42d62d0c6f93d5d2ded327e19ff8c07e586e5ed9eebd00c55239446500cea3a4ea22c38f4d0e32d8dec
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4e9afeacf87b309b35d87b488162b56421f477ce928add35f0f31a6824e0a5f5c31f3bf762ac50e6aef8c7d0e98eb01d4950d0dd67261f8c06dee7e034788e686318884285b1ddce6f64dc9aae9c5479;
+  1 encin
+       !4e9afeacf87b309b35d87b488162b56421f477ce928add35f0f31a6824e0a5f5c31f3bf762ac50e6aef8c7d0e98eb01d4950d0dd67261f8c06dee7e034788e686318884285b1ddce6f64dc9aae9c5479
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e15bb7f491654b63e1ed476efda5b4ed6a86c7c5193cc79da0650b7848e325b392f8321ca8463539f1e1e60777192732c64507162ddcad9fb563b6a34a35af66f6bfad0f7c9d22828c70cb718c40ddfff6;
+  1 encin
+       !e15bb7f491654b63e1ed476efda5b4ed6a86c7c5193cc79da0650b7848e325b392f8321ca8463539f1e1e60777192732c64507162ddcad9fb563b6a34a35af66f6bfad0f7c9d22828c70cb718c40ddfff6
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !12643264e4261ecb9bf62fb88fd3d23fb26e017c16455c888acc5ae6e3bde3689b15659b1ec5942408a90146fbecc56c33136c0e691784ecce9ed0b0181b654f08eea34646ff8db13dc89a2e653164b306be;
+  1 encin
+       !12643264e4261ecb9bf62fb88fd3d23fb26e017c16455c888acc5ae6e3bde3689b15659b1ec5942408a90146fbecc56c33136c0e691784ecce9ed0b0181b654f08eea34646ff8db13dc89a2e653164b306be
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a66947e171591261bc4b41aaf24dc588bcdcbbec645dc4ddfdf3857e799ca30e8e65ac1ff2081dae5f3bc859c3a2f89f644aec1c239f4d498a22be827ef23e48a4771da5f9972cca6378616a8960a5f7c72076;
+  1 encin
+       !a66947e171591261bc4b41aaf24dc588bcdcbbec645dc4ddfdf3857e799ca30e8e65ac1ff2081dae5f3bc859c3a2f89f644aec1c239f4d498a22be827ef23e48a4771da5f9972cca6378616a8960a5f7c72076
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !6f4bacbcfacfd24c2e17bda9e259edb6c02f949f78029a6990b53a5c51e4c103b938556a0f0a67f372c459f04281e1390db713ba8434837de3631e290f0ae637f8423cacad173e7952a021dc0c380ace81f9be89;
+  1 encin
+       !6f4bacbcfacfd24c2e17bda9e259edb6c02f949f78029a6990b53a5c51e4c103b938556a0f0a67f372c459f04281e1390db713ba8434837de3631e290f0ae637f8423cacad173e7952a021dc0c380ace81f9be89
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a4b2340dec02cabb3531362a815759930e2f09b6a466d44afd33959bb753638ce63b8050b365c5e9e00290114c8e8847d909eaca13581366170e6adf31347a9946f7573538d8921239f16b7ea403313a1d0fa218a7;
+  1 encin
+       !a4b2340dec02cabb3531362a815759930e2f09b6a466d44afd33959bb753638ce63b8050b365c5e9e00290114c8e8847d909eaca13581366170e6adf31347a9946f7573538d8921239f16b7ea403313a1d0fa218a7
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !9df08e36f23ceb212520f4461e8df919d09d50e6818fa7571c2139268129ce9310c79e671d4442c330fdc336e3c9ed30f7b0ce90127d2d9d288e4b10078f4f580c0b127791ee53a8a9876f05c64c884fd009dcf9d1ad;
+  1 encin
+       !9df08e36f23ceb212520f4461e8df919d09d50e6818fa7571c2139268129ce9310c79e671d4442c330fdc336e3c9ed30f7b0ce90127d2d9d288e4b10078f4f580c0b127791ee53a8a9876f05c64c884fd009dcf9d1ad
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !dedfd0487fd61a2d9c54495f96a2b5f6c46682d7411c5d9a6e73cb1ab5296353d7c6f0c2fc7b759b233495fdaaf532c2b6c0a1a10252c1f34e1eec567650ccaca1e891c74744d60ca6e132240f56b775fa84618fb9a97e;
+  1 encin
+       !dedfd0487fd61a2d9c54495f96a2b5f6c46682d7411c5d9a6e73cb1ab5296353d7c6f0c2fc7b759b233495fdaaf532c2b6c0a1a10252c1f34e1eec567650ccaca1e891c74744d60ca6e132240f56b775fa84618fb9a97e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c6e3226aa258e7c492e730f5c43e2e39f664a7c9a3a6a038a1ccc077d307c2d2a9e21091f222b9dbc66e9fd462e38e59546cf2706dc02301afa34beb1894c334ce44daddd002250eec388f2e4aa819ac4a943c297292626a;
+  1 encin
+       !c6e3226aa258e7c492e730f5c43e2e39f664a7c9a3a6a038a1ccc077d307c2d2a9e21091f222b9dbc66e9fd462e38e59546cf2706dc02301afa34beb1894c334ce44daddd002250eec388f2e4aa819ac4a943c297292626a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !95fa84145d9a295647c55aac1f55e67ad2b91f7048a066c8314cb1c1b1e5a090c8b4862da9e29e270009f73cf2d7d18206d6a732b46bf85a1a4e44e4188a02a7e26716453df7962c5604195c47d7cc2d5850e8387cc641781f;
+  1 encin
+       !95fa84145d9a295647c55aac1f55e67ad2b91f7048a066c8314cb1c1b1e5a090c8b4862da9e29e270009f73cf2d7d18206d6a732b46bf85a1a4e44e4188a02a7e26716453df7962c5604195c47d7cc2d5850e8387cc641781f
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !960bc94f8c562c75ae7a863757295bda90586db18e675f5b8e93e5897a534a369cf60383f636a81af4a0d48bc9fa11a2d5ce6f56efe48d55fe0202d13a24b64b9b3c6ff8bb27e4eccc3d5260fe5f22bb173d57837d078f11a38d;
+  1 encin
+       !960bc94f8c562c75ae7a863757295bda90586db18e675f5b8e93e5897a534a369cf60383f636a81af4a0d48bc9fa11a2d5ce6f56efe48d55fe0202d13a24b64b9b3c6ff8bb27e4eccc3d5260fe5f22bb173d57837d078f11a38d
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7f437b3d6edcec8b85a6b5a755f0718a63a10d2dbbcf842362c5e32822de6da58deae222ada40efae07b9148b9db97680decfc9c134cacbefbb89a79d685cfd53a33f28a24012d9e6d277350bf5ab87d61d7ef9c322c0c292481e5;
+  1 encin
+       !7f437b3d6edcec8b85a6b5a755f0718a63a10d2dbbcf842362c5e32822de6da58deae222ada40efae07b9148b9db97680decfc9c134cacbefbb89a79d685cfd53a33f28a24012d9e6d277350bf5ab87d61d7ef9c322c0c292481e5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d7078e462a43b0805ea87ad33842b2418bce472ec2a3e2391701e8bb637518aa71bb1dfe34d9f1cd7c5e17858b6614105460e27342493515b90a16a0beb7964fde79f3828f979bf58487cd505f9b56da1b35b2dbaf4a79fc6eea7104;
+  1 encin
+       !d7078e462a43b0805ea87ad33842b2418bce472ec2a3e2391701e8bb637518aa71bb1dfe34d9f1cd7c5e17858b6614105460e27342493515b90a16a0beb7964fde79f3828f979bf58487cd505f9b56da1b35b2dbaf4a79fc6eea7104
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2cb0637be1b04080b43b84fb5275269a25cfc672897886337978163d9e73da4be2bab5036eecc91d19b5c8b542bde6ed4514bb22f3e0a6ea0792ea062c60a96dd266d7e470cf4407463286c5cd0397a8ea0011b3bc6f99be9e78631c65;
+  1 encin
+       !2cb0637be1b04080b43b84fb5275269a25cfc672897886337978163d9e73da4be2bab5036eecc91d19b5c8b542bde6ed4514bb22f3e0a6ea0792ea062c60a96dd266d7e470cf4407463286c5cd0397a8ea0011b3bc6f99be9e78631c65
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !5d7358063a8200c777e45389670e232d4188d628376180c5032dd7f2c11d372eaff574f40a1b58ee0e0af0242bf7c24d5d70b2f7b088c052111006fad011ec35456990459fd16b7db74439c5e9e5f53ad39055adc2786ac65b9c2faed47c;
+  1 encin
+       !5d7358063a8200c777e45389670e232d4188d628376180c5032dd7f2c11d372eaff574f40a1b58ee0e0af0242bf7c24d5d70b2f7b088c052111006fad011ec35456990459fd16b7db74439c5e9e5f53ad39055adc2786ac65b9c2faed47c
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !63d76039f6f5138bd4b61472da6cb3493ae0928323e84244dfc79d832e1f3f93919b619a1526969365b2622ad4fa0f5d6d8302ecc2e5dddb15d22978f52b78f21bb79f6fd0c587cf36a6d38671ad474d4bcbdad048f79e34aeeafa936a4fde;
+  1 encin
+       !63d76039f6f5138bd4b61472da6cb3493ae0928323e84244dfc79d832e1f3f93919b619a1526969365b2622ad4fa0f5d6d8302ecc2e5dddb15d22978f52b78f21bb79f6fd0c587cf36a6d38671ad474d4bcbdad048f79e34aeeafa936a4fde
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4fbb7e5d6f71ab847942a0a0581532679ad7b9a544e42c1a337144c0cc1e779db8172d5fd172e1957d51b3e70fe4fb0930997384efb7f1b17d16b58075f866effa13b13e5104ab8c110c6b9a7c89ff8ad1bebb27a31c22e6e2b49aec205e04b9;
+  1 encin
+       !4fbb7e5d6f71ab847942a0a0581532679ad7b9a544e42c1a337144c0cc1e779db8172d5fd172e1957d51b3e70fe4fb0930997384efb7f1b17d16b58075f866effa13b13e5104ab8c110c6b9a7c89ff8ad1bebb27a31c22e6e2b49aec205e04b9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !805395735a1a2f301dcfbb22cb101078d52fbf686c8998a6c0b2c5f3dee68976dbeef15796df545f345725e72e4b5d48c4b9102932f5db2574d88b91da298421d3f0be76efaafefde2aee208b8ee2e336d33f55047e42f16f87a164f56f3a5f4a0;
+  1 encin
+       !805395735a1a2f301dcfbb22cb101078d52fbf686c8998a6c0b2c5f3dee68976dbeef15796df545f345725e72e4b5d48c4b9102932f5db2574d88b91da298421d3f0be76efaafefde2aee208b8ee2e336d33f55047e42f16f87a164f56f3a5f4a0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !8b53700554352c4e5b1f7907cb52e061b48cf3e459f7db87fc14df1935072944bdf81f088624fe2b7bbd2a4a0e15ffd69017d685b06f138d8bd5f5999e9a1a9592a7774de43014b98cecea6e798eec14b2737239028d70aed2a6e6806bca6f691eaa;
+  1 encin
+       !8b53700554352c4e5b1f7907cb52e061b48cf3e459f7db87fc14df1935072944bdf81f088624fe2b7bbd2a4a0e15ffd69017d685b06f138d8bd5f5999e9a1a9592a7774de43014b98cecea6e798eec14b2737239028d70aed2a6e6806bca6f691eaa
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d6d4465829dfd8dc49547f835882ada15a406833a83ca2f6fbb4bb7c0db0d64ed12884e2d32abc05f0a429287746399e9262e2f304c0ad6ae36c1a5cd530fd929dfb0163017ed471b52fe10c1062c22f046a7fd375cd113d26b38b35504a8f32aefb5a;
+  1 encin
+       !d6d4465829dfd8dc49547f835882ada15a406833a83ca2f6fbb4bb7c0db0d64ed12884e2d32abc05f0a429287746399e9262e2f304c0ad6ae36c1a5cd530fd929dfb0163017ed471b52fe10c1062c22f046a7fd375cd113d26b38b35504a8f32aefb5a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a6b1200dd06a7e2a036e971949474aaa154f524b4215ff691706a0e12498ff335792866ae19a48d8e4335bfb6d85d96126ed7b8b581b7f7042a0c7e5d6901ad8f32b7f29c04463f70aa8d5de527d19df1ad6d48a192109afc58eaa22c515ae0a10fde60c;
+  1 encin
+       !a6b1200dd06a7e2a036e971949474aaa154f524b4215ff691706a0e12498ff335792866ae19a48d8e4335bfb6d85d96126ed7b8b581b7f7042a0c7e5d6901ad8f32b7f29c04463f70aa8d5de527d19df1ad6d48a192109afc58eaa22c515ae0a10fde60c
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !27be9a888de11c9b544d1c8e65b9453737464138e4a25b81ba946034da90d61dbd46cb298f1fecf60b6f9c6351ca9193f1db7f340e876a0ff812a0e4064332f91ac684d31b242229fd19d58c0626a6a43a5d9e8641cf6d9fd072f6e2a15ee1ecfa508e54dd;
+  1 encin
+       !27be9a888de11c9b544d1c8e65b9453737464138e4a25b81ba946034da90d61dbd46cb298f1fecf60b6f9c6351ca9193f1db7f340e876a0ff812a0e4064332f91ac684d31b242229fd19d58c0626a6a43a5d9e8641cf6d9fd072f6e2a15ee1ecfa508e54dd
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !578538e9c435f10544df84cadc023d8513a0e51c73a512764d817d4ceab7f7ceb522031a9f94f0d73aae136f1e0d8468f99ba24f40803ead8beed12fac2385235887cb680ce3aa93f882f62061ff7a6411d4fa0ae395172ccceb4b4ee66c821e6d6b2d979bf2;
+  1 encin
+       !578538e9c435f10544df84cadc023d8513a0e51c73a512764d817d4ceab7f7ceb522031a9f94f0d73aae136f1e0d8468f99ba24f40803ead8beed12fac2385235887cb680ce3aa93f882f62061ff7a6411d4fa0ae395172ccceb4b4ee66c821e6d6b2d979bf2
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2a564c70ffaf1f6c9b4bde77e13b803a92603b1d853555a334d41eb38fca095fee9cf4d47b6dc34226f735c0471bb4ee20ab690a72d4bf6d9e9057fc44082334d00440e6264184e1f2140eea5f795b7b688959f00028d2b2620a1b1e085286ad8d9bce2cdccae7;
+  1 encin
+       !2a564c70ffaf1f6c9b4bde77e13b803a92603b1d853555a334d41eb38fca095fee9cf4d47b6dc34226f735c0471bb4ee20ab690a72d4bf6d9e9057fc44082334d00440e6264184e1f2140eea5f795b7b688959f00028d2b2620a1b1e085286ad8d9bce2cdccae7
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c3a497949629704ca9b40657503c581ba1cebb20b4f7bd3dd1e71f4a7e3cf67e5609cd60b35b2c6fa9df996d7c4609b90dc8195e55b3fcbc90184538c18b1307e5161f85005b1f41b043577548ca9104912ac7aab9c3993169bd66af217efd52d59c0b2217a9595f;
+  1 encin
+       !c3a497949629704ca9b40657503c581ba1cebb20b4f7bd3dd1e71f4a7e3cf67e5609cd60b35b2c6fa9df996d7c4609b90dc8195e55b3fcbc90184538c18b1307e5161f85005b1f41b043577548ca9104912ac7aab9c3993169bd66af217efd52d59c0b2217a9595f
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !fffa26f4dbd0fa61db80afadaec090c5a55a4c3a1394d7aa64b7d144705c3864c5f296ced71fe5e75f7ad7805abc8113417681659a53dff7b6209db2de89412fb3ad47d6eaf6bf4a6b3b10d8f1272dafa114b2ad3f3f1ff7bd72dcb282027879d42d128f197dbf67b2;
+  1 encin
+       !fffa26f4dbd0fa61db80afadaec090c5a55a4c3a1394d7aa64b7d144705c3864c5f296ced71fe5e75f7ad7805abc8113417681659a53dff7b6209db2de89412fb3ad47d6eaf6bf4a6b3b10d8f1272dafa114b2ad3f3f1ff7bd72dcb282027879d42d128f197dbf67b2
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !86cba2f603aae0dcbfbb3ac33c846452e4d0ba8891b11cee14f2117e97b48fc780e19fddd82131f310138a8d806525714a34b1ad02ce1ed1745572c031c64ddfe16b6f90b45242c4522fa8c050a4e392881de0d7d5c36d11774d5d0e83a6614a80bad1e7968d402b8e64;
+  1 encin
+       !86cba2f603aae0dcbfbb3ac33c846452e4d0ba8891b11cee14f2117e97b48fc780e19fddd82131f310138a8d806525714a34b1ad02ce1ed1745572c031c64ddfe16b6f90b45242c4522fa8c050a4e392881de0d7d5c36d11774d5d0e83a6614a80bad1e7968d402b8e64
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !f0334f7e4a7acda9077684729f1740afdd50931e8814f3308a736faeb67d7c70432d076df140034313bece815f7060eca9911359681b6647feda952b8701ecc1996426eb7951df47bb2550700dac2da57643865ab6a3e59598094f72d646d39103d3251f6b2da9663a2ef5;
+  1 encin
+       !f0334f7e4a7acda9077684729f1740afdd50931e8814f3308a736faeb67d7c70432d076df140034313bece815f7060eca9911359681b6647feda952b8701ecc1996426eb7951df47bb2550700dac2da57643865ab6a3e59598094f72d646d39103d3251f6b2da9663a2ef5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !087b6a424f1c2a083940fb4d7c9772eb2fbd9dbbba59054f76c3c0687a78dab3bd6124da5960c9b9618c5b5ac00b6899dbc1d91a75a74d4824c6ab5647b3783ca0da89f2cbcbf2274b1e9529fede6439d7ecaf2ffc08e9ad1903af418590810abf8618668b5dad8ee1b21b18;
+  1 encin
+       !087b6a424f1c2a083940fb4d7c9772eb2fbd9dbbba59054f76c3c0687a78dab3bd6124da5960c9b9618c5b5ac00b6899dbc1d91a75a74d4824c6ab5647b3783ca0da89f2cbcbf2274b1e9529fede6439d7ecaf2ffc08e9ad1903af418590810abf8618668b5dad8ee1b21b18
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !75bd4f8ff0d109a3425322a55977727a53cd81735fe798dea31a1e308bbe6d19cdd4fd309b63c5f0f3891374715ad385f57e780974aaf64c73cf3b183d50755e3c753dd7a080da9da863233619defebe67a3059dc125c707f873ec8acc1334d0226240edd4aab093480598ec21;
+  1 encin
+       !75bd4f8ff0d109a3425322a55977727a53cd81735fe798dea31a1e308bbe6d19cdd4fd309b63c5f0f3891374715ad385f57e780974aaf64c73cf3b183d50755e3c753dd7a080da9da863233619defebe67a3059dc125c707f873ec8acc1334d0226240edd4aab093480598ec21
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !5e86f82dc7b83b01a9d4362e7ad0871c53e8f8c96ff7b78746d0162257fa81771bb8bae3a6f34bccc42951fbc1c06fb1dd518ac733ecc253357c93892946944f815cba634f1f85178f744ac95ce478b2661a740b45a422bf6cec31cfe20d78a3ee978dd1d7e79910a5903bd1c782;
+  1 encin
+       !5e86f82dc7b83b01a9d4362e7ad0871c53e8f8c96ff7b78746d0162257fa81771bb8bae3a6f34bccc42951fbc1c06fb1dd518ac733ecc253357c93892946944f815cba634f1f85178f744ac95ce478b2661a740b45a422bf6cec31cfe20d78a3ee978dd1d7e79910a5903bd1c782
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !3d906019d05fe688c8b215aa6a765e4ca03745195109c46c53f84b3b54dc8e4c2ded2a13de8e8678d94b8dcf9a936783ce726344199e73f82f182459e4bd88fdb6047e7e3bd16d2ff501f62e991e0bda2026be06e661313c532e84396cf6f56afd2ca9f3cc79cf1cc3e52a1d893eb6;
+  1 encin
+       !3d906019d05fe688c8b215aa6a765e4ca03745195109c46c53f84b3b54dc8e4c2ded2a13de8e8678d94b8dcf9a936783ce726344199e73f82f182459e4bd88fdb6047e7e3bd16d2ff501f62e991e0bda2026be06e661313c532e84396cf6f56afd2ca9f3cc79cf1cc3e52a1d893eb6
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !6a65bc3cf9bcad98c0a733fafd599fbc9553584eba486ef3fb197ed4a12ff5da33d7b4bddb9ad153b890f870801b45c1e0115ffa220c24d8d60c5529c81a9141808a4d8ab91f2f93356247bb1c951aaf7d23328562150265130f607d54289500020099a247034a75ee58fd73af740e16;
+  1 encin
+       !6a65bc3cf9bcad98c0a733fafd599fbc9553584eba486ef3fb197ed4a12ff5da33d7b4bddb9ad153b890f870801b45c1e0115ffa220c24d8d60c5529c81a9141808a4d8ab91f2f93356247bb1c951aaf7d23328562150265130f607d54289500020099a247034a75ee58fd73af740e16
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a0648c74ee2872b422b64290354ce4f38de2fb62fbbb99ae2a46a7233b9f4a9ea08ec253aa377042855099edca949834b90091dcf7d946baa658f0ef2906c906f70c151a19a1a73d9ae83176364533cd9b4de078329dd07ea96cdf2f6264446d5b9386a3d4a3f49d6db97e05ec518950aa;
+  1 encin
+       !a0648c74ee2872b422b64290354ce4f38de2fb62fbbb99ae2a46a7233b9f4a9ea08ec253aa377042855099edca949834b90091dcf7d946baa658f0ef2906c906f70c151a19a1a73d9ae83176364533cd9b4de078329dd07ea96cdf2f6264446d5b9386a3d4a3f49d6db97e05ec518950aa
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2c887d8300686768cac139577901999d57371ff152ec09e5cb979cf360a9704669b79a9e9252c6c90ba9f9e44bd5e77224081c3e3aebdc5d8f59a10794dfa167f8c2f6a25b3386eae4dd580ad86ebaa1df9bf5169f09698277f52f6877d3724c05bc07d3975865bc61b19a13174c2a750c96;
+  1 encin
+       !2c887d8300686768cac139577901999d57371ff152ec09e5cb979cf360a9704669b79a9e9252c6c90ba9f9e44bd5e77224081c3e3aebdc5d8f59a10794dfa167f8c2f6a25b3386eae4dd580ad86ebaa1df9bf5169f09698277f52f6877d3724c05bc07d3975865bc61b19a13174c2a750c96
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !63c6df75230c4afab23cf2dc6f92138b9fde21cf5cd48865f3cb44642fb0f36a8212d07e4374351fee51566be0a0a70bfe1fb03b87cac717a3c667fc9190ba053a471428b2cc1329f49976a026150952bd8438220edfc60d9c3cd07dcbb6bff3ff0ea3353afeea85ab194db96161146f5e9e89;
+  1 encin
+       !63c6df75230c4afab23cf2dc6f92138b9fde21cf5cd48865f3cb44642fb0f36a8212d07e4374351fee51566be0a0a70bfe1fb03b87cac717a3c667fc9190ba053a471428b2cc1329f49976a026150952bd8438220edfc60d9c3cd07dcbb6bff3ff0ea3353afeea85ab194db96161146f5e9e89
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !f980b6dd51a09fe70b93e752ec22a082e7a8fc5ffacaa9d53dd68c5688400355e52588087e91e4ee2185d54f998ab1fc1d263bdd5ae9cc1223414113bbc31f4e5eeeeab7764c60319b55beae12c1e02f92d5aa938c10b706027066cebde0269b572ba23f6e4972b127905faad5eaef8c5bc12115;
+  1 encin
+       !f980b6dd51a09fe70b93e752ec22a082e7a8fc5ffacaa9d53dd68c5688400355e52588087e91e4ee2185d54f998ab1fc1d263bdd5ae9cc1223414113bbc31f4e5eeeeab7764c60319b55beae12c1e02f92d5aa938c10b706027066cebde0269b572ba23f6e4972b127905faad5eaef8c5bc12115
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !dee0d26ce7b9d85fefcef72ed7e3c995c06f60de485ce04b0531279d22eb6553bb58fc807e119f98e71220ca51f4242b8ae59228afa4756fd98e3c1f12efea0cd44f1bcdc6ccd6e77e0fff4375e65f0dd1c1a0c79aa17f3c79b09cde2ec364ee122e37a54bd1fdf4d97fa50a40b7eef07f781f9d1a;
+  1 encin
+       !dee0d26ce7b9d85fefcef72ed7e3c995c06f60de485ce04b0531279d22eb6553bb58fc807e119f98e71220ca51f4242b8ae59228afa4756fd98e3c1f12efea0cd44f1bcdc6ccd6e77e0fff4375e65f0dd1c1a0c79aa17f3c79b09cde2ec364ee122e37a54bd1fdf4d97fa50a40b7eef07f781f9d1a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !5fe15102695168abca87356479efd9a734ccbd1ebcc2742f470aec0931a24379d225c9f5617b02415e3db7fd8e741d359a4059830dd9c83c2152370b5b89fae3d6c89ec9445bd339c689741bc08c1ba7392ee4f9cb5d06612dc766919144add4a7659222c8bc3c63b08353e7f24ecfc4b459a27e9bf4;
+  1 encin
+       !5fe15102695168abca87356479efd9a734ccbd1ebcc2742f470aec0931a24379d225c9f5617b02415e3db7fd8e741d359a4059830dd9c83c2152370b5b89fae3d6c89ec9445bd339c689741bc08c1ba7392ee4f9cb5d06612dc766919144add4a7659222c8bc3c63b08353e7f24ecfc4b459a27e9bf4
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4a9ab68772ead5aaa6c1e40e7ce22e1647070b5185a4260cebddb7c7bbf2ab88bf8c81e361cccfac2e96e971cef18e0f16607f04f01fc5131542f3de46ab6192bfcce55fdd37c32fe86423222b6dfa1c443b6e4a1b7039fe07e80f390f6bc99ca5ced16148c39f25f0644ed58fad44bc44fe6fe8ff87c9;
+  1 encin
+       !4a9ab68772ead5aaa6c1e40e7ce22e1647070b5185a4260cebddb7c7bbf2ab88bf8c81e361cccfac2e96e971cef18e0f16607f04f01fc5131542f3de46ab6192bfcce55fdd37c32fe86423222b6dfa1c443b6e4a1b7039fe07e80f390f6bc99ca5ced16148c39f25f0644ed58fad44bc44fe6fe8ff87c9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !eaf08edd13b54042c0b2513d87f8fbe40eeeaba7395f20bfba998f23d19a88753f86588a21d1f47ad76733423bdf27ac253040608d12d7a931495a0572dd025230dc8992423e87639b5948cf792bf205bfc010d6e1edeb7a0244af19e38fe696771a1ba7f50fa7df7e20e2d514b73fa4db9668749f53ae91;
+  1 encin
+       !eaf08edd13b54042c0b2513d87f8fbe40eeeaba7395f20bfba998f23d19a88753f86588a21d1f47ad76733423bdf27ac253040608d12d7a931495a0572dd025230dc8992423e87639b5948cf792bf205bfc010d6e1edeb7a0244af19e38fe696771a1ba7f50fa7df7e20e2d514b73fa4db9668749f53ae91
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !b741f0d5ddf4fd12c35b263c809648be6696576310c2982b2dd2ebf259df191cdbc4792fde17eec1ab0d470c9814ef62248ea816f8cb3a0be431179c0d44762f94014aaefb3227d70eda04f2ab460dd59bff4adced323d673b91d2128fbaed95fc9ccbd68195bf3dc50f382ce3987f7bef692647e8dfbee4d5;
+  1 encin
+       !b741f0d5ddf4fd12c35b263c809648be6696576310c2982b2dd2ebf259df191cdbc4792fde17eec1ab0d470c9814ef62248ea816f8cb3a0be431179c0d44762f94014aaefb3227d70eda04f2ab460dd59bff4adced323d673b91d2128fbaed95fc9ccbd68195bf3dc50f382ce3987f7bef692647e8dfbee4d5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !03b0931db86e38f25ad44cfaafeedfed18b06a97f92eff0d64011cb0733b4e514e59531569fd97b4309801b8671405068159bc1a5ffaf2cb177235ed52fa285d24309f7ab065eee2b69bb7c2c7c20211829883bb2250bce0d233c203748661cdbf9007dacf93746176e2bf4f67fd90a01bfc55723e783729b887;
+  1 encin
+       !03b0931db86e38f25ad44cfaafeedfed18b06a97f92eff0d64011cb0733b4e514e59531569fd97b4309801b8671405068159bc1a5ffaf2cb177235ed52fa285d24309f7ab065eee2b69bb7c2c7c20211829883bb2250bce0d233c203748661cdbf9007dacf93746176e2bf4f67fd90a01bfc55723e783729b887
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !989906fd9f5f75949d1a37e67787ee1ef6e9a363200079e05becff5d47ad954753e5573aa490a193560dc32bdfeacad0e1ba94762967d31a87c3a5ba4ca89eb00db5f3ed51c5f6aa987bd68b8d7d6faccb4c3ee81a9d2d2f1ad36af8717765c076632448b4dea1c7e9cff8ebcb4a56cf6232aff243cdc94d5e3cb1;
+  1 encin
+       !989906fd9f5f75949d1a37e67787ee1ef6e9a363200079e05becff5d47ad954753e5573aa490a193560dc32bdfeacad0e1ba94762967d31a87c3a5ba4ca89eb00db5f3ed51c5f6aa987bd68b8d7d6faccb4c3ee81a9d2d2f1ad36af8717765c076632448b4dea1c7e9cff8ebcb4a56cf6232aff243cdc94d5e3cb1
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4a372dac2c861d6198141bbe14c36939fe30c5766fe2aa1c6c97c236e131f0fc77255636552d9a201c598c69d72482886db1ce216c50cfb870e622ad866518f6ce0d69d4bb6af0d53105a024ac3af6a684ce751dd2ce22b4aedf869f4c4ac8153e4c6c11188a1a7efa9ad48f0c219447bb0b2db7863495224cfb92f9;
+  1 encin
+       !4a372dac2c861d6198141bbe14c36939fe30c5766fe2aa1c6c97c236e131f0fc77255636552d9a201c598c69d72482886db1ce216c50cfb870e622ad866518f6ce0d69d4bb6af0d53105a024ac3af6a684ce751dd2ce22b4aedf869f4c4ac8153e4c6c11188a1a7efa9ad48f0c219447bb0b2db7863495224cfb92f9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !49cdb3599b611bcb646931ea2cd3c1060ee0a9929da09814766ec5a2b21c40b45f538d495a5222dedcc132cbb1ec9fac86413e51968c986a461376b32d9ef7e46d6eb78d30c1de2cdbe962406299f415b71bf161b2b281f86bc78d4c607d1998ddd54605a5c320da45733d83f6025cbfd8040f238be9e599d2c75b8966;
+  1 encin
+       !49cdb3599b611bcb646931ea2cd3c1060ee0a9929da09814766ec5a2b21c40b45f538d495a5222dedcc132cbb1ec9fac86413e51968c986a461376b32d9ef7e46d6eb78d30c1de2cdbe962406299f415b71bf161b2b281f86bc78d4c607d1998ddd54605a5c320da45733d83f6025cbfd8040f238be9e599d2c75b8966
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ea38bad18ac44276bd7a3f160166311eb27e5290267e2f9532d3780bc31d47ff1a3b14f4dc4ca025f5f62735205fdbe6c26f96cbcdef43b6a00f22ea30cf76068decad0d9bea2c943f112cc0233d862f9f729e1a8563c3aaa8d9dd7ea6060c4d080be791865b38d54517e01a7bc06b8172347dfcfa58a4af0cb726ec0615;
+  1 encin
+       !ea38bad18ac44276bd7a3f160166311eb27e5290267e2f9532d3780bc31d47ff1a3b14f4dc4ca025f5f62735205fdbe6c26f96cbcdef43b6a00f22ea30cf76068decad0d9bea2c943f112cc0233d862f9f729e1a8563c3aaa8d9dd7ea6060c4d080be791865b38d54517e01a7bc06b8172347dfcfa58a4af0cb726ec0615
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !cb799d41fdeca9a8edf3be872ef7ae761b03f63503d4d9e7296c386dbc4032396844e9949a77dff11174a74d0f0d90a6cd54f8f32188756639949478dc73a386d79dff19238a2ea6d5595e5015ac55f5bba55390a8d1c0eeaf908068167c7b86b4633b632cb0e271c35506baad8f79a63e04face56d157101c7bfa2f6aaadb;
+  1 encin
+       !cb799d41fdeca9a8edf3be872ef7ae761b03f63503d4d9e7296c386dbc4032396844e9949a77dff11174a74d0f0d90a6cd54f8f32188756639949478dc73a386d79dff19238a2ea6d5595e5015ac55f5bba55390a8d1c0eeaf908068167c7b86b4633b632cb0e271c35506baad8f79a63e04face56d157101c7bfa2f6aaadb
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1730946f2b7514c84c2bb6ac6e268d42627d50a468c466a6fb8e7b6a27062df5b9bd67c858bd2b174a8ae43e506177fceaafde77296c5febf48fb91b6fbd38bd476bc5f4b1b246516ac7cb536887dad9e7a058ccff5733c443fdcb4ec7fccec491f204e07e801ada05af9df8b267ec7669b1d213d74fdb4c996ac67ff7b14d79;
+  1 encin
+       !1730946f2b7514c84c2bb6ac6e268d42627d50a468c466a6fb8e7b6a27062df5b9bd67c858bd2b174a8ae43e506177fceaafde77296c5febf48fb91b6fbd38bd476bc5f4b1b246516ac7cb536887dad9e7a058ccff5733c443fdcb4ec7fccec491f204e07e801ada05af9df8b267ec7669b1d213d74fdb4c996ac67ff7b14d79
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !9e8b99a3af0f1e8b6316b1c0efcd812160803e80b9652d059bf2f85ec2e91581c6128e2d2afbfae23accfda5acfab80baad8466e97f3f73899ccbd9de6048dd85aeb5ab78a39fdca62af5a4c556feddbf97a50f7fc376c3a41c46bb599d6a44334dcb17a03fa93262aae1041322dcc17d7e08a655985fe6574db79f951f336bda7;
+  1 encin
+       !9e8b99a3af0f1e8b6316b1c0efcd812160803e80b9652d059bf2f85ec2e91581c6128e2d2afbfae23accfda5acfab80baad8466e97f3f73899ccbd9de6048dd85aeb5ab78a39fdca62af5a4c556feddbf97a50f7fc376c3a41c46bb599d6a44334dcb17a03fa93262aae1041322dcc17d7e08a655985fe6574db79f951f336bda7
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a21883c5d37094d553045637551fd4993ee73471e6fd2152111a3c5336622130199e981dce4ec30a8f151d6b1b3b070a343196c8624146f6247bc79bee489e883d2a6e720995b684c5b30f9aa734b6f1891ccaf05f464dcd9bcfbdcbac372e28845de339f8920716ba6efe914c166817c74f2df2e5331997426548a92be3a2dd5679;
+  1 encin
+       !a21883c5d37094d553045637551fd4993ee73471e6fd2152111a3c5336622130199e981dce4ec30a8f151d6b1b3b070a343196c8624146f6247bc79bee489e883d2a6e720995b684c5b30f9aa734b6f1891ccaf05f464dcd9bcfbdcbac372e28845de339f8920716ba6efe914c166817c74f2df2e5331997426548a92be3a2dd5679
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !8d5a18f2b27043ec61d95990211be55d3901870f9ef30b2403e59bd09b30617f5e5043089ebd916a3f13591d72d7394ad4b2dc66ebebb7c1c5e6329525d8bf1c2cfe5f657363c180bd37f39f8e0fe67c16918d02a7dbc30d4436441d8383b7b50e8ce8d414506c20917b29d4b0f249fefef11cac8af387d27d0d45149860685143cbc0;
+  1 encin
+       !8d5a18f2b27043ec61d95990211be55d3901870f9ef30b2403e59bd09b30617f5e5043089ebd916a3f13591d72d7394ad4b2dc66ebebb7c1c5e6329525d8bf1c2cfe5f657363c180bd37f39f8e0fe67c16918d02a7dbc30d4436441d8383b7b50e8ce8d414506c20917b29d4b0f249fefef11cac8af387d27d0d45149860685143cbc0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c512f89967db78a64284f9e8975327fe142cce566d2adad60dc3ec81d462877fea4fe06a32428b9a148dd9a8d4a661be6c56582e30a65d6e3289c08dcadcc717e4e9f785a7a887d652174f586286d9d2104171f938b084ed61dc5df1158c328e361c75b9901807dd2563d1be9c1507b4dbd1bafefb837ff8a2538c131425a27d29d59938;
+  1 encin
+       !c512f89967db78a64284f9e8975327fe142cce566d2adad60dc3ec81d462877fea4fe06a32428b9a148dd9a8d4a661be6c56582e30a65d6e3289c08dcadcc717e4e9f785a7a887d652174f586286d9d2104171f938b084ed61dc5df1158c328e361c75b9901807dd2563d1be9c1507b4dbd1bafefb837ff8a2538c131425a27d29d59938
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !467c5e146445701168ce494b307cd12c729189b1c1176ff06ef8f93ff1b0690f311e284b68380395224cdea9e382a69b8d5fe027a5f79ccab42f523a1749362873aed701acbede76da4614cc538310027a37bcb6518e19c8ce3ab8b7c98f486217e3263887566cc8be7447cd5b14bfd27ed2336496ee9b4542603456d0511bbcebe3d1a2f8;
+  1 encin
+       !467c5e146445701168ce494b307cd12c729189b1c1176ff06ef8f93ff1b0690f311e284b68380395224cdea9e382a69b8d5fe027a5f79ccab42f523a1749362873aed701acbede76da4614cc538310027a37bcb6518e19c8ce3ab8b7c98f486217e3263887566cc8be7447cd5b14bfd27ed2336496ee9b4542603456d0511bbcebe3d1a2f8
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !0fb913af1109a3ba37d5085ea5540b1ee92c5aed16f00fad7aad185e67c6071be4d496df368c7bf8e4acabd275754a6f1e8f59dd5c590dd4f43e86f4f150dd5a6f2d8f79852ab4df1274b660720409993effaff1da293fdf035acee7a60ad46a5f8d308aeeb97124f2429c4f19354faa8a2ef7dbfc7a44685601dbff5561dcd7d69e8d6b9e87;
+  1 encin
+       !0fb913af1109a3ba37d5085ea5540b1ee92c5aed16f00fad7aad185e67c6071be4d496df368c7bf8e4acabd275754a6f1e8f59dd5c590dd4f43e86f4f150dd5a6f2d8f79852ab4df1274b660720409993effaff1da293fdf035acee7a60ad46a5f8d308aeeb97124f2429c4f19354faa8a2ef7dbfc7a44685601dbff5561dcd7d69e8d6b9e87
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !26d41ee387956931db354efe7fb8bc6a517e5418806986d8f758934f40f61d71788296cd7e3fee5f8c2ccd32375527c39c4de49b53c6c71726145fb173bd091230842edfc5f54c9ec2012c06decd95881d9da61d4c93ba6c7fff662073969fd74eb12a3b8ed255b01fc2c138f45033c03a77b127d0a17d4a00c02599fea636e1afbb257b9afb92;
+  1 encin
+       !26d41ee387956931db354efe7fb8bc6a517e5418806986d8f758934f40f61d71788296cd7e3fee5f8c2ccd32375527c39c4de49b53c6c71726145fb173bd091230842edfc5f54c9ec2012c06decd95881d9da61d4c93ba6c7fff662073969fd74eb12a3b8ed255b01fc2c138f45033c03a77b127d0a17d4a00c02599fea636e1afbb257b9afb92
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !67f8a44aaff6a6854b93913b91acf1ff4279196ead3237bb06ec6186ed2ce0d0b89adaed048d0fd098e2192fd3ea2a61657f05d488a9ed67078d93ae8b90d45b2498a368cdb1da1c90aca04f6d1109bbbe219b6dc9f8a9c74aaf30ad127d50286409d9ee829a20c25b365bef91582c0261d6b34adbe0cdc638b90c17edf99f8b1464986012542dba;
+  1 encin
+       !67f8a44aaff6a6854b93913b91acf1ff4279196ead3237bb06ec6186ed2ce0d0b89adaed048d0fd098e2192fd3ea2a61657f05d488a9ed67078d93ae8b90d45b2498a368cdb1da1c90aca04f6d1109bbbe219b6dc9f8a9c74aaf30ad127d50286409d9ee829a20c25b365bef91582c0261d6b34adbe0cdc638b90c17edf99f8b1464986012542dba
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !cdda0d5dc2e67d6068e0489111a8a7b04beb7acd74f69fc6ee867ad5da4fdf93267b2085186a8c243b61bf93b9ecaa3f4288597cf18ced9dab52efa3cb52b01211527a90872755862c765d659baa936a5eb74d2c5de82206ae1b170183ea10f49de534928879d813b4f450c3c1b8f5e80de7282b010a3c1d20214b0127fd0ab1fa34818275cc959540;
+  1 encin
+       !cdda0d5dc2e67d6068e0489111a8a7b04beb7acd74f69fc6ee867ad5da4fdf93267b2085186a8c243b61bf93b9ecaa3f4288597cf18ced9dab52efa3cb52b01211527a90872755862c765d659baa936a5eb74d2c5de82206ae1b170183ea10f49de534928879d813b4f450c3c1b8f5e80de7282b010a3c1d20214b0127fd0ab1fa34818275cc959540
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ff7cf9c75c7604cbb436d1b77819520b3fba90750073a66ed6df1533aa012bae59b17d5dc60832695394f3f9893857169ae23d961c96c6ec35054e55d600a62c9f0313780a7b8b3e6c55b3d268fdc25bcd379971fd82639c375ff0ca93b116bb992b137758c8ccfb1379406d50f64d58095b90076561706ab302db92d47c4ebf54ca9b2ba5594c1cd67f;
+  1 encin
+       !ff7cf9c75c7604cbb436d1b77819520b3fba90750073a66ed6df1533aa012bae59b17d5dc60832695394f3f9893857169ae23d961c96c6ec35054e55d600a62c9f0313780a7b8b3e6c55b3d268fdc25bcd379971fd82639c375ff0ca93b116bb992b137758c8ccfb1379406d50f64d58095b90076561706ab302db92d47c4ebf54ca9b2ba5594c1cd67f
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !57b2bfaec0af01a35c50b5b0d8d6dd4ca5d9cb51ecaa601e31f845cc6772b6522112c913ef6f3b875ff364f91d60b340b687e1d54163e05086b69518c6697faa995a4cbbe7b467ec7d49b6cdd074d3458de3bf45eb468b3b6e4949725bb6d67e2e69788d35bb36817791f2d55b1289281f614d48f6d74f20856be25523e285df3febfb775289b4491635b2;
+  1 encin
+       !57b2bfaec0af01a35c50b5b0d8d6dd4ca5d9cb51ecaa601e31f845cc6772b6522112c913ef6f3b875ff364f91d60b340b687e1d54163e05086b69518c6697faa995a4cbbe7b467ec7d49b6cdd074d3458de3bf45eb468b3b6e4949725bb6d67e2e69788d35bb36817791f2d55b1289281f614d48f6d74f20856be25523e285df3febfb775289b4491635b2
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !55af1f6bbdc6cb39b760e9f2b0bb10078cac8178deed373a5593730cf99c67356a352dcd3c6cbbd046cbb0c4f1e0c4658e982f4052a908c95e53d18704eb50d1d53a4ac371a96eecbca72a017ad9e91a34842233e48450b191ac8bd18d0e55d8ce893f690d50ebba44c7c85f1cce6e99b6eb7f626ba32729c4871222e893592df5904ac3a102d139ebb8ad6a;
+  1 encin
+       !55af1f6bbdc6cb39b760e9f2b0bb10078cac8178deed373a5593730cf99c67356a352dcd3c6cbbd046cbb0c4f1e0c4658e982f4052a908c95e53d18704eb50d1d53a4ac371a96eecbca72a017ad9e91a34842233e48450b191ac8bd18d0e55d8ce893f690d50ebba44c7c85f1cce6e99b6eb7f626ba32729c4871222e893592df5904ac3a102d139ebb8ad6a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !817f9d166e2324ca704127c3235a0201526f6cae694aa8a8a8cfab625d28f75a639c816562ac0f520b8ce5f075be45cd939a1978224d9b7a5cc703a623cf7c1c255825f246b6ff608bd90a859d6e4119b27e48018c8acf6fb82ea093d2c926a3f4a5f0d7f91953c0610858d063f2d28fb13c12d8f02a0c078707408c323ba8be17ce2a8df6862095adce0ead83;
+  1 encin
+       !817f9d166e2324ca704127c3235a0201526f6cae694aa8a8a8cfab625d28f75a639c816562ac0f520b8ce5f075be45cd939a1978224d9b7a5cc703a623cf7c1c255825f246b6ff608bd90a859d6e4119b27e48018c8acf6fb82ea093d2c926a3f4a5f0d7f91953c0610858d063f2d28fb13c12d8f02a0c078707408c323ba8be17ce2a8df6862095adce0ead83
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7298ea337f59a018915318a4d0db523f1df3d0be7c3da956e040361f40e48eb7e0bc2dfa76e840cd47e3d62c6345be06a0b05cbb17633c1892f0c4d5d9929bde4ddf116b6114e10ed97c625702f60dfcf2c9bbf89f4602490c35f9098d6f345fcd2c4988ff1a67033ed4eea7949432ff1e01ac43a0f134d221e6aea1b3c8d48c137a28da8b1f27b87fa698732cb0;
+  1 encin
+       !7298ea337f59a018915318a4d0db523f1df3d0be7c3da956e040361f40e48eb7e0bc2dfa76e840cd47e3d62c6345be06a0b05cbb17633c1892f0c4d5d9929bde4ddf116b6114e10ed97c625702f60dfcf2c9bbf89f4602490c35f9098d6f345fcd2c4988ff1a67033ed4eea7949432ff1e01ac43a0f134d221e6aea1b3c8d48c137a28da8b1f27b87fa698732cb0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7cdf8bf7ca3c72b62bbf780fb64e525aed5941c5b427df53214e667aad02e66214082074bf5289412f065e28b5519d9e72990e7da6b821939b7003ed9d14be5d8e40e5b108163143032cf3ec8de24223ba39a7b31d3758a26992c0282bc8750768b9d7dc4873ea35a09dbfe21e87bf8dac2864cd7a6f9f233945a6d90a34b82c75b9cf3041d026a56f67c00b78dcc4;
+  1 encin
+       !7cdf8bf7ca3c72b62bbf780fb64e525aed5941c5b427df53214e667aad02e66214082074bf5289412f065e28b5519d9e72990e7da6b821939b7003ed9d14be5d8e40e5b108163143032cf3ec8de24223ba39a7b31d3758a26992c0282bc8750768b9d7dc4873ea35a09dbfe21e87bf8dac2864cd7a6f9f233945a6d90a34b82c75b9cf3041d026a56f67c00b78dcc4
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !bfd7ed1fb1d60722deed37eee14269fa78711a348e141f74f1dc099369785bdf7ca057e1a9b8b8c312d780c714d0573a2d3f470c095f860eaa12f69178ea50e69c0c328cdcbd5e224c303f58ed28063c2bfb6ee0744de16664d3fbf3a865e5a4d24535d2ba07033f20ffdb85b3c7877aff32b8d221108b3ae453df3d83741b4d78b55b2541eae332e38083d56e9bacf9;
+  1 encin
+       !bfd7ed1fb1d60722deed37eee14269fa78711a348e141f74f1dc099369785bdf7ca057e1a9b8b8c312d780c714d0573a2d3f470c095f860eaa12f69178ea50e69c0c328cdcbd5e224c303f58ed28063c2bfb6ee0744de16664d3fbf3a865e5a4d24535d2ba07033f20ffdb85b3c7877aff32b8d221108b3ae453df3d83741b4d78b55b2541eae332e38083d56e9bacf9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e7c484b50b855361c92113e093248397d429ad660b492d7cee162225be9be63c73a97d70202e511222075a6d456af4a1db02e9db54a120cc34088813c8c9ff466382147470a64c9376508d5198051dc5956a1ecca55da430a897922cf9feb2a02dd1230b015bc7693ba20a159dc2bb33df14b9a07d84815b51aa87b2a95fd3c6e641de935958e8bd39c0d4fb9f1bd8e090;
+  1 encin
+       !e7c484b50b855361c92113e093248397d429ad660b492d7cee162225be9be63c73a97d70202e511222075a6d456af4a1db02e9db54a120cc34088813c8c9ff466382147470a64c9376508d5198051dc5956a1ecca55da430a897922cf9feb2a02dd1230b015bc7693ba20a159dc2bb33df14b9a07d84815b51aa87b2a95fd3c6e641de935958e8bd39c0d4fb9f1bd8e090
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d074a37adcf01819fc6a0d9147bf55b3c4ef2f14f900ae750241648c134428dad5138117bc92b9ea4c0bb8838c8e578e909effb483d63b59500bce9e6ead001d8d21aef7cad4bf92ce2b7ae99885ea1444d065fc58026682d4e7d6f25fbb4952e2ce5fc50796a0332fabaa3a7cc3521d3a1d3994ef0cc3324ee0c04c928b3054326fff80bdbbe2c0ca251cefa84ff86e3e6e;
+  1 encin
+       !d074a37adcf01819fc6a0d9147bf55b3c4ef2f14f900ae750241648c134428dad5138117bc92b9ea4c0bb8838c8e578e909effb483d63b59500bce9e6ead001d8d21aef7cad4bf92ce2b7ae99885ea1444d065fc58026682d4e7d6f25fbb4952e2ce5fc50796a0332fabaa3a7cc3521d3a1d3994ef0cc3324ee0c04c928b3054326fff80bdbbe2c0ca251cefa84ff86e3e6e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !990e4ae01929cd998c3568ec423b4bd62a07a635453bb8a75c68c7db0ed42661294b8f7b0ba120885bcde030fadd1f8ef4f72650789da415ca81dc28b215d981909d6f67d3c03742028538a679b3f20ddae154b4d050748da40c93c2a6dd38287838118245ce3005f653aaf3af86e4b52159fd43984bca37f5c16b880c64154330134903dae9cddc6606f67acb5efb98eaf9ee;
+  1 encin
+       !990e4ae01929cd998c3568ec423b4bd62a07a635453bb8a75c68c7db0ed42661294b8f7b0ba120885bcde030fadd1f8ef4f72650789da415ca81dc28b215d981909d6f67d3c03742028538a679b3f20ddae154b4d050748da40c93c2a6dd38287838118245ce3005f653aaf3af86e4b52159fd43984bca37f5c16b880c64154330134903dae9cddc6606f67acb5efb98eaf9ee
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ad097be738311d2e3d2a39e3ee1b4bfe04bec56469d598b4b4e8834fc676df55cc9c84dbfaef232c595d15a89aabd037e9dc42227222e73aba94237615e296bc0f74e5cb363f16ddfb688c03fdfa10de2a24b5363241830d90dabfcd2fcd5759728ed2a8e65698780dc4851868791d86984ea5950f84e23e02ead6128cd93e68139b87f4ff50b53aef621ffc0bb6f8c645081765;
+  1 encin
+       !ad097be738311d2e3d2a39e3ee1b4bfe04bec56469d598b4b4e8834fc676df55cc9c84dbfaef232c595d15a89aabd037e9dc42227222e73aba94237615e296bc0f74e5cb363f16ddfb688c03fdfa10de2a24b5363241830d90dabfcd2fcd5759728ed2a8e65698780dc4851868791d86984ea5950f84e23e02ead6128cd93e68139b87f4ff50b53aef621ffc0bb6f8c645081765
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a292c951bf6914dc7215b8cc0643713e537adad6c5277ae3ffbab54cd6b6ba66b26e09b793af29e1b076e4c42a604385a1cb10e7e62b1b80a5b629305d343ef63a259c2b80e08b3c9f81dd5f9d81cce72ebd43b819efb12538f6a4d2ecfd20cb792106d4f830f47e17b1868514ce494c5394701bc4f0c7e6f151631953527b78b21f5127e128984d2b97cdb8e36e8c38fb084f9e86;
+  1 encin
+       !a292c951bf6914dc7215b8cc0643713e537adad6c5277ae3ffbab54cd6b6ba66b26e09b793af29e1b076e4c42a604385a1cb10e7e62b1b80a5b629305d343ef63a259c2b80e08b3c9f81dd5f9d81cce72ebd43b819efb12538f6a4d2ecfd20cb792106d4f830f47e17b1868514ce494c5394701bc4f0c7e6f151631953527b78b21f5127e128984d2b97cdb8e36e8c38fb084f9e86
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d78adbbbaf2c814d5ece2c7d946606951b1801c95be9594398aa6c1121bd48892f5e53b27a364a4d4d60a5ffdbf430b9e0058594e9a18bd0f875e0d3525b326e629f5a2a8552eef0c09188364ed7a1c27b59cd5b29155d77db49051eee69b6f01f49d23dcb5fb00e4c649a2cab73b34ca2ce7f7e307e9ae50ce9ff6b718a6165a5b0053d1fa94ee35ee2052d19215d6f92801c6263c0;
+  1 encin
+       !d78adbbbaf2c814d5ece2c7d946606951b1801c95be9594398aa6c1121bd48892f5e53b27a364a4d4d60a5ffdbf430b9e0058594e9a18bd0f875e0d3525b326e629f5a2a8552eef0c09188364ed7a1c27b59cd5b29155d77db49051eee69b6f01f49d23dcb5fb00e4c649a2cab73b34ca2ce7f7e307e9ae50ce9ff6b718a6165a5b0053d1fa94ee35ee2052d19215d6f92801c6263c0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !91553d2f6c335608f38b20fef4372d877d851d9f15f3088ea772a77880a9761784912d9863ab94984e7a047241b048d4fbf9dd3ae6f69be65b3a9fac8da0a3fc83968d9cde57f062eb67404b86eee957263b1bbd6d73d76bef122c5262fd33d2a84bccb5f39743b47f23d73850e68796a603ecf1957025ee90608b66c6137f08d56c4e2d5866265943dd1d5057a2495add3db8093d9359;
+  1 encin
+       !91553d2f6c335608f38b20fef4372d877d851d9f15f3088ea772a77880a9761784912d9863ab94984e7a047241b048d4fbf9dd3ae6f69be65b3a9fac8da0a3fc83968d9cde57f062eb67404b86eee957263b1bbd6d73d76bef122c5262fd33d2a84bccb5f39743b47f23d73850e68796a603ecf1957025ee90608b66c6137f08d56c4e2d5866265943dd1d5057a2495add3db8093d9359
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !38a6a59d061f04f11ba59e1a39bdeaf5394895f788738eff0def07797d99371f02ad9f1f5e624308c1356730f1561008e0ae46ee68439715107ab75bdf960f5d2970c3899735fe9ae934afeb67a862c54eef175cbeaf856e84ca623f1e33084c21f9e5d7e68808b26edff9b08584537453f60ddbd52affd973423a3e671f5010f84908a9d76ee8e3a63b7d70f79e26c90f865a265184ba64;
+  1 encin
+       !38a6a59d061f04f11ba59e1a39bdeaf5394895f788738eff0def07797d99371f02ad9f1f5e624308c1356730f1561008e0ae46ee68439715107ab75bdf960f5d2970c3899735fe9ae934afeb67a862c54eef175cbeaf856e84ca623f1e33084c21f9e5d7e68808b26edff9b08584537453f60ddbd52affd973423a3e671f5010f84908a9d76ee8e3a63b7d70f79e26c90f865a265184ba64
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !88368e2008e4625020bdc44e0ce3a7931a4e8ae20d109ff1ea15dadc5f5f20a20c397c08defe92c08bb3c9616af246a1081e79b3fab37030580c1184cc7b0e10ec37c7e0ca79e8cb2dc356fbdc920162407dbf70f16e44cddd14d96159e8ea3b90231f35356976c508ee854085bca1cd2601cdc4aeff90aa1e341a64f164acd6e75fdb4344bee0950c4c93a66cd73b58c9ad4969d704e4bef8;
+  1 encin
+       !88368e2008e4625020bdc44e0ce3a7931a4e8ae20d109ff1ea15dadc5f5f20a20c397c08defe92c08bb3c9616af246a1081e79b3fab37030580c1184cc7b0e10ec37c7e0ca79e8cb2dc356fbdc920162407dbf70f16e44cddd14d96159e8ea3b90231f35356976c508ee854085bca1cd2601cdc4aeff90aa1e341a64f164acd6e75fdb4344bee0950c4c93a66cd73b58c9ad4969d704e4bef8
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !61bfce8ba6e1b8c43b1cb6d42068b9a05732db6d7ab6c6bf0eb5646952dfdedaaab8c098b68ff62bd5afefcdb8b9efa817db9a2c73287c80770cccaa904f978608cd084d64dfcff4694cba64d197f4d51d7bf727cb55c6218470ac2c4cf0097dc5af9e1aba3853f935c90627e8520c6c2dab7f49f8614c6aa2d732ae04483446925d6a24ae292ec5a5b5c614f3570f2cd4b2e7b43e3895708926;
+  1 encin
+       !61bfce8ba6e1b8c43b1cb6d42068b9a05732db6d7ab6c6bf0eb5646952dfdedaaab8c098b68ff62bd5afefcdb8b9efa817db9a2c73287c80770cccaa904f978608cd084d64dfcff4694cba64d197f4d51d7bf727cb55c6218470ac2c4cf0097dc5af9e1aba3853f935c90627e8520c6c2dab7f49f8614c6aa2d732ae04483446925d6a24ae292ec5a5b5c614f3570f2cd4b2e7b43e3895708926
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7a2ede61e2fde8e1745851495017a161de04c347153f7ec572b4c60b22e1c10509a5767dd664f2df7d1d8e86f2262396d0fcb7e7339fe53f4c80882b4d2b43add0736694a7829bda043cc744f236f1f5b9f61f7fd77b38819257f1e7c632d84e23d40e921b65b04439afa64c053cc9a3dc42e95c089495b571bc7493ded7c9c6be32e1a5288d3ca20861c9bbaf1261909acfa6a66a1ee3dce159de;
+  1 encin
+       !7a2ede61e2fde8e1745851495017a161de04c347153f7ec572b4c60b22e1c10509a5767dd664f2df7d1d8e86f2262396d0fcb7e7339fe53f4c80882b4d2b43add0736694a7829bda043cc744f236f1f5b9f61f7fd77b38819257f1e7c632d84e23d40e921b65b04439afa64c053cc9a3dc42e95c089495b571bc7493ded7c9c6be32e1a5288d3ca20861c9bbaf1261909acfa6a66a1ee3dce159de
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d7caceec9406ce456325d8c2d72a56fc3c648e949eb2e69f815f6a4607a3dcc2d980d15672325f3aa714f7c3560aaa7076912cb9a9073d382730a4d2f08636f5c8a75252a4517355845f2bf956c1768694aa523b94440e01d526ce4f1d289c413f02ad16b5de0de49602ec3469edd588c06a8f40eb25ef5440ec4ea5d9ff3c35aa75468b05026b6850895e64fc6ff718ef4f6988972d978a679c7550;
+  1 encin
+       !d7caceec9406ce456325d8c2d72a56fc3c648e949eb2e69f815f6a4607a3dcc2d980d15672325f3aa714f7c3560aaa7076912cb9a9073d382730a4d2f08636f5c8a75252a4517355845f2bf956c1768694aa523b94440e01d526ce4f1d289c413f02ad16b5de0de49602ec3469edd588c06a8f40eb25ef5440ec4ea5d9ff3c35aa75468b05026b6850895e64fc6ff718ef4f6988972d978a679c7550
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2d651c94a7ed4d02d256b4039661e0dc59e6a15b582e2aaa4931ad644d9765ffea394266410efa7502bd4a86a9f45f1c337c18510bbfa4f5bd40d9d1d0ba37f216d0980647266f382e448f8911c02f4840f9aa5c7dfc1a60bfbe90822358d46b7ef3bce139112101dc85ad5153233429cee3cfb9399c028400bdf7010083ab5defc0a2e3be79f95f76995e5e466641743d410533a5ca6e2b398da11bb5;
+  1 encin
+       !2d651c94a7ed4d02d256b4039661e0dc59e6a15b582e2aaa4931ad644d9765ffea394266410efa7502bd4a86a9f45f1c337c18510bbfa4f5bd40d9d1d0ba37f216d0980647266f382e448f8911c02f4840f9aa5c7dfc1a60bfbe90822358d46b7ef3bce139112101dc85ad5153233429cee3cfb9399c028400bdf7010083ab5defc0a2e3be79f95f76995e5e466641743d410533a5ca6e2b398da11bb5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !0976f8129dd12c3f8dea983af67ae3aadfbdafd1fc4070454e5f48a69491e6fb34abb1aba463547b8ac75b036c8acbf71760d560453da42b4d6eb9d648a9e3305329fcf206291d3ce91da0a00f3d7d9f56f5e828b5403c1ea451d731c8751a07943cccade4d76bc4ad467a08a35f3d5f2412ea96ff4affad059e5b13d8aac4160e40b13406cdf643df1a70d9f9a564c3c104f66b1e341cb70b0e9768c903;
+  1 encin
+       !0976f8129dd12c3f8dea983af67ae3aadfbdafd1fc4070454e5f48a69491e6fb34abb1aba463547b8ac75b036c8acbf71760d560453da42b4d6eb9d648a9e3305329fcf206291d3ce91da0a00f3d7d9f56f5e828b5403c1ea451d731c8751a07943cccade4d76bc4ad467a08a35f3d5f2412ea96ff4affad059e5b13d8aac4160e40b13406cdf643df1a70d9f9a564c3c104f66b1e341cb70b0e9768c903
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !976ef493928a00c12152f71ee7f0471090b83d2443131f0f5906e825dd28a42601dee4a590eb773e9accb1c9651fe70d12ebad1ed6e48534a2c532dbb8da858ad46612cec9a3a1189643f3321b7cb1b450b1a2b536d4b80be7809693ebbd3a621e13d3fa245fe32cb36b38e42f83db93b5318caadc6ca85f74f4a9f15b01e1524a2f63e713b28fa8fd9f42ae5b46c1734f6d93b3bf7845e44275af3051d8d4;
+  1 encin
+       !976ef493928a00c12152f71ee7f0471090b83d2443131f0f5906e825dd28a42601dee4a590eb773e9accb1c9651fe70d12ebad1ed6e48534a2c532dbb8da858ad46612cec9a3a1189643f3321b7cb1b450b1a2b536d4b80be7809693ebbd3a621e13d3fa245fe32cb36b38e42f83db93b5318caadc6ca85f74f4a9f15b01e1524a2f63e713b28fa8fd9f42ae5b46c1734f6d93b3bf7845e44275af3051d8d4
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !8ac2ef579459419d2d55a05cc2b1b38f2c214f917b6803c414487e168415010103ec052e2d34110a9400993c3db3ae2811153428a4bd102f7002d253db77da3bb8f19dd64cb2c9889e777c0e91d6935815f46f69ca20c7ce9ce987f1a8f53d2d827dd7966c7e3f678e6ae080db3b3139c6ac83f821d17c45e4a385e47b5257387f2bdcc8d95cc465b240fb0149499035a5dd93f428eb8a42793fbb9e4ae88d67;
+  1 encin
+       !8ac2ef579459419d2d55a05cc2b1b38f2c214f917b6803c414487e168415010103ec052e2d34110a9400993c3db3ae2811153428a4bd102f7002d253db77da3bb8f19dd64cb2c9889e777c0e91d6935815f46f69ca20c7ce9ce987f1a8f53d2d827dd7966c7e3f678e6ae080db3b3139c6ac83f821d17c45e4a385e47b5257387f2bdcc8d95cc465b240fb0149499035a5dd93f428eb8a42793fbb9e4ae88d67
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !930bc40db6824175fec1a6ac155183afb11bdbb2ff1c32a4425f7667171e1271ac4d436c10c839bc85a1172a4095501e62a53a0c5933a7fee45b5415dc26bb68fbb4768b4bee89b14bce1459a8f46d84d2ac9f5fa4b43f66a719a1d74837da85de979ea0ff975441f8ec34225a17a4a326fc6273614d4643c672da8d8a22a8cac265adaf916b7bd11f30e8282a268e4abb16fed4677dc963bcf5e360b03d862adb;
+  1 encin
+       !930bc40db6824175fec1a6ac155183afb11bdbb2ff1c32a4425f7667171e1271ac4d436c10c839bc85a1172a4095501e62a53a0c5933a7fee45b5415dc26bb68fbb4768b4bee89b14bce1459a8f46d84d2ac9f5fa4b43f66a719a1d74837da85de979ea0ff975441f8ec34225a17a4a326fc6273614d4643c672da8d8a22a8cac265adaf916b7bd11f30e8282a268e4abb16fed4677dc963bcf5e360b03d862adb
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d18d19dc4a66a1994dd58caa14ae538160d710af67597889f5c5d7d1a6c2a7d076ac4fb070200e0e1deecd1d0f1189dea5f2d542b8375317fe734a52cda4b40b414816201de095841a89db465cbbc198b4e3d2239afd4b07add7cf5e4ba5c934c65a485e8c2d682546d28f435234b6208ad0fe9f02192bb9b2c1b73e20716e39525f586f12f5f9fe8e0c58381b8f26651794a3156261b94795e98cb494b8402f0034;
+  1 encin
+       !d18d19dc4a66a1994dd58caa14ae538160d710af67597889f5c5d7d1a6c2a7d076ac4fb070200e0e1deecd1d0f1189dea5f2d542b8375317fe734a52cda4b40b414816201de095841a89db465cbbc198b4e3d2239afd4b07add7cf5e4ba5c934c65a485e8c2d682546d28f435234b6208ad0fe9f02192bb9b2c1b73e20716e39525f586f12f5f9fe8e0c58381b8f26651794a3156261b94795e98cb494b8402f0034
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !8f6ed81d1b3df9d227a6c0d1d7fcbd0dac459e92a6c8e7ede2f3f58767722026d6308129bb753818e0ec585a5e3e56dab714ae1aae8b7bc2e0625e0ef8294d1d7a048bd25bef0dfe581c08356ea0198430698d2499f0b833f6e3d22d8cdf7abfb3178365c082d274014fe6afcdd0e8e024c89f75f9ee6a12357684612d557ed1544931a04ab1ebedc73450f9126f805f62660e46298a930af945d5e737365b8eed349e;
+  1 encin
+       !8f6ed81d1b3df9d227a6c0d1d7fcbd0dac459e92a6c8e7ede2f3f58767722026d6308129bb753818e0ec585a5e3e56dab714ae1aae8b7bc2e0625e0ef8294d1d7a048bd25bef0dfe581c08356ea0198430698d2499f0b833f6e3d22d8cdf7abfb3178365c082d274014fe6afcdd0e8e024c89f75f9ee6a12357684612d557ed1544931a04ab1ebedc73450f9126f805f62660e46298a930af945d5e737365b8eed349e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !394cc6c775f2c9d0f178ccab1f32a9beb6f19f33bc82aaf734f30b4499a70ea6cad8e3c074766a466c7f541a460453b99bde9a5119a83f6360aeced4dfea527178008c38ea08a27352f731e8e5f2698e1fc030e26378bb597a6cb1153e2b2c6c2ed827efa4d941e3caecbbbbc16036cf614f0f8ebb1d355003f854c90b8e1ad325ba6269bbfc1807a8e067a546523c6e0b0a034affc0a4c8f8d10bd9d7f926e6c383c6d8;
+  1 encin
+       !394cc6c775f2c9d0f178ccab1f32a9beb6f19f33bc82aaf734f30b4499a70ea6cad8e3c074766a466c7f541a460453b99bde9a5119a83f6360aeced4dfea527178008c38ea08a27352f731e8e5f2698e1fc030e26378bb597a6cb1153e2b2c6c2ed827efa4d941e3caecbbbbc16036cf614f0f8ebb1d355003f854c90b8e1ad325ba6269bbfc1807a8e067a546523c6e0b0a034affc0a4c8f8d10bd9d7f926e6c383c6d8
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !503e331b0acc00f2fc35dd9d8f145b2eb5c2e1ed3204dfdcc0a624eabd913ffac3dd87cd30a972df89ec6ccf43cfaadf5deca3c0448d510600068033201099f1c8e3f08eadb73ee63bc06e63e7df525458abf9b54113aebf3825127b1a0bdc12c96665e1cdd1ef08a66d147e727dadf9172076215a53f21b1201112cf2b57b33e10c8bed75afa629afe4e9f6510c77b853d64c218af57edcb68281594afc61f926a659bafd;
+  1 encin
+       !503e331b0acc00f2fc35dd9d8f145b2eb5c2e1ed3204dfdcc0a624eabd913ffac3dd87cd30a972df89ec6ccf43cfaadf5deca3c0448d510600068033201099f1c8e3f08eadb73ee63bc06e63e7df525458abf9b54113aebf3825127b1a0bdc12c96665e1cdd1ef08a66d147e727dadf9172076215a53f21b1201112cf2b57b33e10c8bed75afa629afe4e9f6510c77b853d64c218af57edcb68281594afc61f926a659bafd
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !794a8b86dcef1e3409d82b9e460403e67a7719c399dbab43e23610347bb0c275bf7ca6babe885231398c04b6492b6bec7ec678f6ca6ab5b23e1466dfd253bf270f08cc6a467cc4bedec91bce70e95b87be5509501260ab8edd3c1a2ccac8722e3cfc6687c962aa9ccb1f7fca535d38b0c930ebe9a63407a0308aa6198b90fa0ed3d4918f962be7391c7ab9444beb642f6fb06f3a2df0bba77fdb29bd7ac2420aeeb9bcfecc0a;
+  1 encin
+       !794a8b86dcef1e3409d82b9e460403e67a7719c399dbab43e23610347bb0c275bf7ca6babe885231398c04b6492b6bec7ec678f6ca6ab5b23e1466dfd253bf270f08cc6a467cc4bedec91bce70e95b87be5509501260ab8edd3c1a2ccac8722e3cfc6687c962aa9ccb1f7fca535d38b0c930ebe9a63407a0308aa6198b90fa0ed3d4918f962be7391c7ab9444beb642f6fb06f3a2df0bba77fdb29bd7ac2420aeeb9bcfecc0a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !7e3f2d928ed2d2e4e1cf6c534b57d52235d437d9377b00760467bba709f113b0b562e52c1a077ffeff2622ea38f7f787ac7dbbc4b29aa7fc5d9e8d58977a2bf94172e00b3fc7f63875f08f1e5c67e2737259faf012e4362177affa06f24859b476a8ab55798bba9702980f57d78b0f1306b4dd7be7118ace1bbbe1a23340226fb91499d938f10573d720c4c72e3d116dd6d72fd7920a7af69b1f600b5cfbba5538645ce50aae1e;
+  1 encin
+       !7e3f2d928ed2d2e4e1cf6c534b57d52235d437d9377b00760467bba709f113b0b562e52c1a077ffeff2622ea38f7f787ac7dbbc4b29aa7fc5d9e8d58977a2bf94172e00b3fc7f63875f08f1e5c67e2737259faf012e4362177affa06f24859b476a8ab55798bba9702980f57d78b0f1306b4dd7be7118ace1bbbe1a23340226fb91499d938f10573d720c4c72e3d116dd6d72fd7920a7af69b1f600b5cfbba5538645ce50aae1e
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !30ad0da493ebd63c8fc042db11b23a2d203bae61cffd6194337d4ad838589b693211b89a25f845d15c8dcbe61442b1a2f44fd4ec5a6bfdb43ecd0bcc5fb8da34d68f2c20ef1433422d658c917a25fc440b4c2b151a62b949e184f58f501ff0c6d77335ac8db3127e38313fe96c4b109e9c05233e300fd9c9fdf45b700e8ee0553c55bdaedc0d43856cbf8679f53525e722f3e3435eb4f154137195c27590c8e6eb7455f64d11c546;
+  1 encin
+       !30ad0da493ebd63c8fc042db11b23a2d203bae61cffd6194337d4ad838589b693211b89a25f845d15c8dcbe61442b1a2f44fd4ec5a6bfdb43ecd0bcc5fb8da34d68f2c20ef1433422d658c917a25fc440b4c2b151a62b949e184f58f501ff0c6d77335ac8db3127e38313fe96c4b109e9c05233e300fd9c9fdf45b700e8ee0553c55bdaedc0d43856cbf8679f53525e722f3e3435eb4f154137195c27590c8e6eb7455f64d11c546
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e3177d315779299d808bd2c34eca11dfb2efd5f0c11c354d59b9bc2d29eab2767cce65797e2d2cd94328dda9e700eaadd66dd23a7bcce40c978e5fa0081056d393cd1612ae248ad340dd33e0605cfba4c899dd7f78e4fdeec95d53b0fdac26217fe1a6f0104ddc0f2929feb54db9b07a6b8801c99978a6db91cbefb9f3001bef853424018d5911c2c22fa4d2939b5ead3457274332a2b223f2c8eccaec8a632ada3bb746e55adbf77f;
+  1 encin
+       !e3177d315779299d808bd2c34eca11dfb2efd5f0c11c354d59b9bc2d29eab2767cce65797e2d2cd94328dda9e700eaadd66dd23a7bcce40c978e5fa0081056d393cd1612ae248ad340dd33e0605cfba4c899dd7f78e4fdeec95d53b0fdac26217fe1a6f0104ddc0f2929feb54db9b07a6b8801c99978a6db91cbefb9f3001bef853424018d5911c2c22fa4d2939b5ead3457274332a2b223f2c8eccaec8a632ada3bb746e55adbf77f
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !584cee6d2cbdcde833d8d786bc1939a8a3da9ee634703bf690532eff66665478b7c2478a2df42e0326cca1fd6f891c81a261489e8c37471f031874970bd556c6747626b6fdd05d4c4f4531da9a938030d38626f661ccec2faea96affc1273fc48245cd1828b346bb6ea7e107026171c06db53e08a66286a9b945a7142236ea16133e217aa104a2920eb401f4404d6dcb9589d694b0d6ef8c61e9a2a9f584a4a3af56449f2aaea8d06534;
+  1 encin
+       !584cee6d2cbdcde833d8d786bc1939a8a3da9ee634703bf690532eff66665478b7c2478a2df42e0326cca1fd6f891c81a261489e8c37471f031874970bd556c6747626b6fdd05d4c4f4531da9a938030d38626f661ccec2faea96affc1273fc48245cd1828b346bb6ea7e107026171c06db53e08a66286a9b945a7142236ea16133e217aa104a2920eb401f4404d6dcb9589d694b0d6ef8c61e9a2a9f584a4a3af56449f2aaea8d06534
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1e11e7edfa768149f9969b5863f1a2240c90f528593d0bd47ca6636a564aa7218cefe194a1d57c557b1429779336b8bd2cacfe63e15b4e8161f584ab860069ff5d3bccfd6b3c8be24789f2988fe8c1bd23fdf2a870fc502e8e25d2fd90ab4c95dcd929a050d99d3e2ef0a4e0fd8e42b5a73300becd80d6571ba8ebfcef4aa5a152843ac09f6c102b765c7e422f619563b18c5fc18bbdb279c6463b84116373adaf8c776c68b85221fe0abd;
+  1 encin
+       !1e11e7edfa768149f9969b5863f1a2240c90f528593d0bd47ca6636a564aa7218cefe194a1d57c557b1429779336b8bd2cacfe63e15b4e8161f584ab860069ff5d3bccfd6b3c8be24789f2988fe8c1bd23fdf2a870fc502e8e25d2fd90ab4c95dcd929a050d99d3e2ef0a4e0fd8e42b5a73300becd80d6571ba8ebfcef4aa5a152843ac09f6c102b765c7e422f619563b18c5fc18bbdb279c6463b84116373adaf8c776c68b85221fe0abd
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !2219a18f102a95f8e186531b43cfc32c33b502b82f8327224423866a8f107e14dbac95eaffdac32deb461ca94008c4285478d2e294972cedc61af9a02c6a650261b3fe05d96e6e5de9f88c996a9fdba504b762e5e662f59b918a054bd44dcda3c093b49726d361a7c9efa020f7c5548ee1f671e17d1add2a5f802b2b661e8b4ac6ff9c4463776a8cc1d0db851dee9f53ac32c54f4f93641be604bb671db1be856fa228a41c6cd3bbb947cfb0;
+  1 encin
+       !2219a18f102a95f8e186531b43cfc32c33b502b82f8327224423866a8f107e14dbac95eaffdac32deb461ca94008c4285478d2e294972cedc61af9a02c6a650261b3fe05d96e6e5de9f88c996a9fdba504b762e5e662f59b918a054bd44dcda3c093b49726d361a7c9efa020f7c5548ee1f671e17d1add2a5f802b2b661e8b4ac6ff9c4463776a8cc1d0db851dee9f53ac32c54f4f93641be604bb671db1be856fa228a41c6cd3bbb947cfb0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ae249337097bb506049440d2c68004517c467292742e4153c5f76bbfaf608b092e681b8eb012163166ef2be88b704d859ec57405bb3a3b15bcd9167d9c007f3865250cc614b8dda4864868243303c31749f2a4f32f967f95c28b4b80ff9f089d670af32b62641dd213d6c3d9553d16a1e398985a304c0ce4b535b8d2ec7b8328039883d55afe35cfb3cde5b59d21b5c85d14de7498404b25470f931e77bfa9658d92171cc3ea7b31406b1d2b03;
+  1 encin
+       !ae249337097bb506049440d2c68004517c467292742e4153c5f76bbfaf608b092e681b8eb012163166ef2be88b704d859ec57405bb3a3b15bcd9167d9c007f3865250cc614b8dda4864868243303c31749f2a4f32f967f95c28b4b80ff9f089d670af32b62641dd213d6c3d9553d16a1e398985a304c0ce4b535b8d2ec7b8328039883d55afe35cfb3cde5b59d21b5c85d14de7498404b25470f931e77bfa9658d92171cc3ea7b31406b1d2b03
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d3001684fb506a9e086187174ac74f28c7d78412658329bde0ffb2c70b47fbb071ff32f79b1386e88f6050969da71e1f44524a09c601d52dac9884e21869c7321a3a1a70e714723024f368889a7eb52ec19b4356962a9e38f7b8a03d092b218e2b175d691555b300a02ec585f5504b8d68a908ff6c62e38c5dd590fc783e751fe425e9af00b0c743cb48be38de4300b42609d2bbb3956ddd771865ed365790d5455253799a2df6a08e0bfee50595;
+  1 encin
+       !d3001684fb506a9e086187174ac74f28c7d78412658329bde0ffb2c70b47fbb071ff32f79b1386e88f6050969da71e1f44524a09c601d52dac9884e21869c7321a3a1a70e714723024f368889a7eb52ec19b4356962a9e38f7b8a03d092b218e2b175d691555b300a02ec585f5504b8d68a908ff6c62e38c5dd590fc783e751fe425e9af00b0c743cb48be38de4300b42609d2bbb3956ddd771865ed365790d5455253799a2df6a08e0bfee50595
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !4f78ed9d5c890216da2099901998bf64bd90a0426a3d31dd0e8789a37659d9ddfd1154f7407c3cb6a2000a87fe1fb050f84715bb5dcd02e61e51cfbe67d95504b9c83a3e988cb77408d468ffb869aec42291d414be67049af20b9e10c59ef5ef39f3945c146c4ab941cec0043afb9460878a2c513080df8c757fbccb2269512c08136dcda6cfe8b0a6dbd3fe2754cf4551cf8a5a95a6215e677bded62ea4487ac6304b028154eba7e98e024112f28a;
+  1 encin
+       !4f78ed9d5c890216da2099901998bf64bd90a0426a3d31dd0e8789a37659d9ddfd1154f7407c3cb6a2000a87fe1fb050f84715bb5dcd02e61e51cfbe67d95504b9c83a3e988cb77408d468ffb869aec42291d414be67049af20b9e10c59ef5ef39f3945c146c4ab941cec0043afb9460878a2c513080df8c757fbccb2269512c08136dcda6cfe8b0a6dbd3fe2754cf4551cf8a5a95a6215e677bded62ea4487ac6304b028154eba7e98e024112f28a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !49a411020d58068cf8d35e23b4155598b348a9f91b92dfd0e831f7c040b7d4b696fbc5b4ca0e40cf9c57843dd440aa6c85e84e7c0091443baa205bfc668883380124d84fb042b92fd982099567b2f6048a0ec215975114990b3c72a09d684a21c006bae1dff5010d84330203c64f2afe2127ecac142760f3732f382658bb6b3ee3e58afbe7f231851ffbbc5220906a8acbb7ff61bb797996b590aeaeea7f1cd5769703fc182959c6082fbf1678f314ec;
+  1 encin
+       !49a411020d58068cf8d35e23b4155598b348a9f91b92dfd0e831f7c040b7d4b696fbc5b4ca0e40cf9c57843dd440aa6c85e84e7c0091443baa205bfc668883380124d84fb042b92fd982099567b2f6048a0ec215975114990b3c72a09d684a21c006bae1dff5010d84330203c64f2afe2127ecac142760f3732f382658bb6b3ee3e58afbe7f231851ffbbc5220906a8acbb7ff61bb797996b590aeaeea7f1cd5769703fc182959c6082fbf1678f314ec
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !e439fc3b2bc7687dbf83956f3b2174e9c3b137e33d42661129c9fd00b7b6514608b03b68361d950b8c49f493eba04fa2c3f1b66bc4484ad07b81f65f7755609755adbeec725db22c9115cd1d2010eacb784a5b88b06a1e0e7c0ad63fdbbedbbd407d94df8740b014706acd1a27effd43581e9b218837512feb0f60141371ab6910098ff0e457c5df82779947197e46213e8b5973d4cef2e41b326a203f4bba820c18127e7aabe7abf06a12b8f31660c223;
+  1 encin
+       !e439fc3b2bc7687dbf83956f3b2174e9c3b137e33d42661129c9fd00b7b6514608b03b68361d950b8c49f493eba04fa2c3f1b66bc4484ad07b81f65f7755609755adbeec725db22c9115cd1d2010eacb784a5b88b06a1e0e7c0ad63fdbbedbbd407d94df8740b014706acd1a27effd43581e9b218837512feb0f60141371ab6910098ff0e457c5df82779947197e46213e8b5973d4cef2e41b326a203f4bba820c18127e7aabe7abf06a12b8f31660c223
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !13e0220a51a95659729e38e45e6f189923e230e75ba60282ee7c1064bcf5fdabc446a44f16e36a1d3d0dee3933359f8c2ec41595494918e8ac5a69b131775febb8d2d0510e2a78932f084eb875ba8a22da5033123debd857a16811a2fe87997d59eebd6832371e7f893bc182b019fb750bca23ee7c80335e90f72ce6bdf1bdaf2b4597684bc22c43be120452f4cd8f8f1c9e5ca0a8fbd434ed889ba8fea8ec5a3e101b0185a661e261620166b534b59dd3b9;
+  1 encin
+       !13e0220a51a95659729e38e45e6f189923e230e75ba60282ee7c1064bcf5fdabc446a44f16e36a1d3d0dee3933359f8c2ec41595494918e8ac5a69b131775febb8d2d0510e2a78932f084eb875ba8a22da5033123debd857a16811a2fe87997d59eebd6832371e7f893bc182b019fb750bca23ee7c80335e90f72ce6bdf1bdaf2b4597684bc22c43be120452f4cd8f8f1c9e5ca0a8fbd434ed889ba8fea8ec5a3e101b0185a661e261620166b534b59dd3b9
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !1bb9929153b43eba74014f0a3e9232b6b09c3264f7b51321dfdef0d31a83ac116f742fd8af086514605e91e04eac8a19463f156863ba14440c4c85aedfc741a1d6208bf6fb8c40e63da89216a7548b53def99de221ed4cb5bf0a9bc450763c21ed9345acc1a4f64b73a2ae652508f5ce7b8dd3f6e9df8674e6c987f8436a2c2418425008b1b75995cba10d2e0a871c694de76bbb0e21c1c24d1503fbb46e1e693ddb21c5876fbaca82e479f660fe67a7686a7a;
+  1 encin
+       !1bb9929153b43eba74014f0a3e9232b6b09c3264f7b51321dfdef0d31a83ac116f742fd8af086514605e91e04eac8a19463f156863ba14440c4c85aedfc741a1d6208bf6fb8c40e63da89216a7548b53def99de221ed4cb5bf0a9bc450763c21ed9345acc1a4f64b73a2ae652508f5ce7b8dd3f6e9df8674e6c987f8436a2c2418425008b1b75995cba10d2e0a871c694de76bbb0e21c1c24d1503fbb46e1e693ddb21c5876fbaca82e479f660fe67a7686a7a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !d0302df57b17f2f3188b63b200d2e9ec3915ce60514c9b6941f9a29031cd1f68e2c07af6400bda66945b1753a33b26ff6c2dabe6ffdc1fa915b3422ef0c1444aa71522d656dc225981f345771dec1dfd304733be682194b89d3c90ae3a490a309709909998a1edb6dd6f65f9e7ee49bb80b0d5ed399dab5a18573fa6df6e986ea4a53fd062638472f9162e2abe43de24fbb1ec1461ff86a498ee0877100c907b0158638ea75fae34ddaa6ce9963636af55f7e0c0;
+  1 encin
+       !d0302df57b17f2f3188b63b200d2e9ec3915ce60514c9b6941f9a29031cd1f68e2c07af6400bda66945b1753a33b26ff6c2dabe6ffdc1fa915b3422ef0c1444aa71522d656dc225981f345771dec1dfd304733be682194b89d3c90ae3a490a309709909998a1edb6dd6f65f9e7ee49bb80b0d5ed399dab5a18573fa6df6e986ea4a53fd062638472f9162e2abe43de24fbb1ec1461ff86a498ee0877100c907b0158638ea75fae34ddaa6ce9963636af55f7e0c0
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !35b23065c41551d21bca567870fcac995aabf14c1f9f32d6638cb75964c5924e03902a5ca638abe78af8af70b448c113498a000289efd5e0a9c5b5ede89445e42dd3140fe0d73089f3d8223d9d662111e67809a539f034a07971ab886121a8bddcd45bdafdc249b15b1556ea2bdd0221a75fb575a76a56ff2557bc6b1773b4ac0317f141f35dbd032e32236039a3d881e15951e3e54c4bcfd364a9b9696f281fc750f1153c3fa2e3b87fe0cc3a73249daab30e15c6;
+  1 encin
+       !35b23065c41551d21bca567870fcac995aabf14c1f9f32d6638cb75964c5924e03902a5ca638abe78af8af70b448c113498a000289efd5e0a9c5b5ede89445e42dd3140fe0d73089f3d8223d9d662111e67809a539f034a07971ab886121a8bddcd45bdafdc249b15b1556ea2bdd0221a75fb575a76a56ff2557bc6b1773b4ac0317f141f35dbd032e32236039a3d881e15951e3e54c4bcfd364a9b9696f281fc750f1153c3fa2e3b87fe0cc3a73249daab30e15c6
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !6aa7cbfd617d2dc854b2e65e4fe5077fb991987bbe6a2e274f8dfe06bc62b2c9539bddb7db1a6a76adde9b78d6b73776700e30dfa42cd4d96dfa359d8857ae3a952ceab3bc7b266d33dff9a75da46aa4ade9031eac27428f49dfd30dfe4894f1b7d474e50dbdb06987aa29b280eb0bca726e1246e8fbaa0d623cc4df1bd9d551e67d0aea9337c63446124ddafe3f942f5b05897f49c902a8f67c31a0a51455c6b2b7e845c68f2f82f6c86e6f5bbc37f78622bb067693;
+  1 encin
+       !6aa7cbfd617d2dc854b2e65e4fe5077fb991987bbe6a2e274f8dfe06bc62b2c9539bddb7db1a6a76adde9b78d6b73776700e30dfa42cd4d96dfa359d8857ae3a952ceab3bc7b266d33dff9a75da46aa4ade9031eac27428f49dfd30dfe4894f1b7d474e50dbdb06987aa29b280eb0bca726e1246e8fbaa0d623cc4df1bd9d551e67d0aea9337c63446124ddafe3f942f5b05897f49c902a8f67c31a0a51455c6b2b7e845c68f2f82f6c86e6f5bbc37f78622bb067693
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !3d4f01c3f52db6eadd975fb99c579dd8ed921c67d577e3ad51f2eee94c643d31cd4e27636234478d2aa718b85656c9ffa3f8a4874e465f3b8007776b0124949eaa7a2f4199d9203cfc46e154bf62c36fa8f31d07efd9fe2333d42fcba6438a2022ee8e37b67489c9595efc02c7488eb05c9d691d2da641043610d800ffcf497ba5dfb1be9263fa7b05dd27ded3bdf7a463443c5cc11d2506f2e221cc13446a04e5e8a42941e55a52c135fb139b97cdd9dab1b22f9f4c40;
+  1 encin
+       !3d4f01c3f52db6eadd975fb99c579dd8ed921c67d577e3ad51f2eee94c643d31cd4e27636234478d2aa718b85656c9ffa3f8a4874e465f3b8007776b0124949eaa7a2f4199d9203cfc46e154bf62c36fa8f31d07efd9fe2333d42fcba6438a2022ee8e37b67489c9595efc02c7488eb05c9d691d2da641043610d800ffcf497ba5dfb1be9263fa7b05dd27ded3bdf7a463443c5cc11d2506f2e221cc13446a04e5e8a42941e55a52c135fb139b97cdd9dab1b22f9f4c40
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !82ba5683a6b7b686523481e90adce794dbe49e5e80217d798272ae66f5827fe7bd0900d6bd0cb3101916a4284420298e8826afd5ec0e9a9c78ead1f48c8007f8cb4e20364adde10ec5f843e92e717106498cbc7ed7741f5e0db2a9ef48f5c07db71d4f31be38bcb1532c16fdbf3001300861ee0d9b2b06be8779cf13d8436b28af7e87ba69634bbdbccbee94201c93273089dd9fb8a6acb7fa6f1238effce72ee5130ac3930d947ba7f8bc4cd91e129a7cbafbeb4c32d01a;
+  1 encin
+       !82ba5683a6b7b686523481e90adce794dbe49e5e80217d798272ae66f5827fe7bd0900d6bd0cb3101916a4284420298e8826afd5ec0e9a9c78ead1f48c8007f8cb4e20364adde10ec5f843e92e717106498cbc7ed7741f5e0db2a9ef48f5c07db71d4f31be38bcb1532c16fdbf3001300861ee0d9b2b06be8779cf13d8436b28af7e87ba69634bbdbccbee94201c93273089dd9fb8a6acb7fa6f1238effce72ee5130ac3930d947ba7f8bc4cd91e129a7cbafbeb4c32d01a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !11b58ac73a99abf28873aaa1f820ba419659265dd34df84986f5437b6a9a353438e4f4d0134bad123e648ee670ee7eccb75c4a47f768006645020483a8e4e3f538b761a427763a2389d6b00b4b75226b21ee8b22d799c15df53fc786000a2e42d687b84419d4cd709b82c1b79313c642686a221194cdbdce50f52a678273182309dc50ff1b71d73c398937a090ac47e36d1abbe0ab5ee526a19e64c34ca1b54d67b23b002ba33ae1538f7a4cfdeb897bd930fc0cae0bf99470;
+  1 encin
+       !11b58ac73a99abf28873aaa1f820ba419659265dd34df84986f5437b6a9a353438e4f4d0134bad123e648ee670ee7eccb75c4a47f768006645020483a8e4e3f538b761a427763a2389d6b00b4b75226b21ee8b22d799c15df53fc786000a2e42d687b84419d4cd709b82c1b79313c642686a221194cdbdce50f52a678273182309dc50ff1b71d73c398937a090ac47e36d1abbe0ab5ee526a19e64c34ca1b54d67b23b002ba33ae1538f7a4cfdeb897bd930fc0cae0bf99470
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a6e6e7cd064b56599f350078aa8009f5c496f976525b4543ce8b5aed07b97b2d9ed2a6ec53b175740bc0a709b21b90a775ac216c925c4d2c8662bbf6839bafda30657c11e688cafd61779fbf345bd662f0253cd292a65bfa69d235c2ddd31f82bd2b72c354ba2345848e417cbdcb15b8bd18dac3f490c2bbca39a5fe839a22a5bc9d588971b7c6765b6367bae62fcad0e88246e515d47f3dfd706f5d2b2ad2fd678b3ba13c589ba7a9be4d140f77553ba09dc01e7b6eab91bbe8;
+  1 encin
+       !a6e6e7cd064b56599f350078aa8009f5c496f976525b4543ce8b5aed07b97b2d9ed2a6ec53b175740bc0a709b21b90a775ac216c925c4d2c8662bbf6839bafda30657c11e688cafd61779fbf345bd662f0253cd292a65bfa69d235c2ddd31f82bd2b72c354ba2345848e417cbdcb15b8bd18dac3f490c2bbca39a5fe839a22a5bc9d588971b7c6765b6367bae62fcad0e88246e515d47f3dfd706f5d2b2ad2fd678b3ba13c589ba7a9be4d140f77553ba09dc01e7b6eab91bbe8
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !46ae65281aa759e1e8a46a5041503ebdcea654a9e36e593f37feed335172d4bc6b6774fd4c3a0965f04a69ee35dc96eb3cd4d16f62a5996b1c9040f4b5b5bc0230286c1c9cdb9ceeb96f8297466d1bbfc8ced321e11af6a1582672c8e82f54d8474c05310f67313bbb074d78fc938e5dbf18eac026370010e20d968a15b1acc9d7d4f83c8608b84570d999c151b1ee55fbc15c7cbf8235d95bbb710cbf3d606133dfe910824606f2a1c55accb3de74b67c963cf0077d778bd68d8a;
+  1 encin
+       !46ae65281aa759e1e8a46a5041503ebdcea654a9e36e593f37feed335172d4bc6b6774fd4c3a0965f04a69ee35dc96eb3cd4d16f62a5996b1c9040f4b5b5bc0230286c1c9cdb9ceeb96f8297466d1bbfc8ced321e11af6a1582672c8e82f54d8474c05310f67313bbb074d78fc938e5dbf18eac026370010e20d968a15b1acc9d7d4f83c8608b84570d999c151b1ee55fbc15c7cbf8235d95bbb710cbf3d606133dfe910824606f2a1c55accb3de74b67c963cf0077d778bd68d8a
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !beccfb6865d93fc79df6863c229892181813ad92f2b7ae1069a0d359cab9ceb4b2bd78b5a77cd3557b3100709aee138c152663f8f01d2872c38133a1c2ca375379eeaadf41c5291e73e580a6b43d763a6d88b14be8f6898e636f9b57f3020ab4f83c6d36397d9e1fe63f62bc37bf5449eba8621febd9679b6d314e2992d2e02580b471c12deaadcf674c05db4a7e4ae2b29827f7744e2f08d6c4a9e1732b2cf24b036bc5e9b6d39be223117c2f6a4581868cfe14bd6ff5aeb583b848;
+  1 encin
+       !beccfb6865d93fc79df6863c229892181813ad92f2b7ae1069a0d359cab9ceb4b2bd78b5a77cd3557b3100709aee138c152663f8f01d2872c38133a1c2ca375379eeaadf41c5291e73e580a6b43d763a6d88b14be8f6898e636f9b57f3020ab4f83c6d36397d9e1fe63f62bc37bf5449eba8621febd9679b6d314e2992d2e02580b471c12deaadcf674c05db4a7e4ae2b29827f7744e2f08d6c4a9e1732b2cf24b036bc5e9b6d39be223117c2f6a4581868cfe14bd6ff5aeb583b848
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !95ca5c74d1ee38d0fb0c75d8890ab98f8b9219aaccb500ee6257efbf26412c6f8909069a43f66ed0a4452ff21a7b8b995f2bce9b636a1363f582397133900410714fec452c95f109ef21a5ac227ae925c2e78baf70ff404f2447d802fa680820fa1686f8dd8dd9c163a2451ee9587cdccb288b4cc4bbb2f9e8950f5d8744ec5d5d9f1074e33ae98359c68d0ec1fc665c7e55efd68e97283257a4f3adf46276d480b66ae8cf4dc43c1152ea087717250d888ced63f6aed38f220c86116f;
+  1 encin
+       !95ca5c74d1ee38d0fb0c75d8890ab98f8b9219aaccb500ee6257efbf26412c6f8909069a43f66ed0a4452ff21a7b8b995f2bce9b636a1363f582397133900410714fec452c95f109ef21a5ac227ae925c2e78baf70ff404f2447d802fa680820fa1686f8dd8dd9c163a2451ee9587cdccb288b4cc4bbb2f9e8950f5d8744ec5d5d9f1074e33ae98359c68d0ec1fc665c7e55efd68e97283257a4f3adf46276d480b66ae8cf4dc43c1152ea087717250d888ced63f6aed38f220c86116f
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !0f7e862cc4b8330d51d29e038100afc60afee12133bc2005549a46bb45fab3bcdfb9bb25039a066029f4b293b6bfbe128dc9ad86e365b67cd7f6a368620a0d20f23d3fe368f5d75bc96949706674272bab848e63ce53e0d18fa1f5945a396a67af66f9399c01103fc768471f6b146ae82c1624f6aaa9a41edb27ef3feade42034c7d7278c1e3dc2fdcc9ded319dd0548a0d14dc6bc94a821c6cfa351e8b105f65208afc56fc0fdc6c1307767a3ebe6df1533b8ee53be66f39be14f311b57;
+  1 encin
+       !0f7e862cc4b8330d51d29e038100afc60afee12133bc2005549a46bb45fab3bcdfb9bb25039a066029f4b293b6bfbe128dc9ad86e365b67cd7f6a368620a0d20f23d3fe368f5d75bc96949706674272bab848e63ce53e0d18fa1f5945a396a67af66f9399c01103fc768471f6b146ae82c1624f6aaa9a41edb27ef3feade42034c7d7278c1e3dc2fdcc9ded319dd0548a0d14dc6bc94a821c6cfa351e8b105f65208afc56fc0fdc6c1307767a3ebe6df1533b8ee53be66f39be14f311b57
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !99e949b44e949bcbaed6b35d39f94327764bcee5268f6634e4fb0c8a7b8e5c5cdfa9524a7f1fe38c59c65a281093b6ccbfe5e87b3661f5757aa50465b70d65090a1c16563ea62af36e20d1885dcbd100a9bce0f96158b0dc4d0fcbc2ab65658c6d9d2fe7b3abe31f25eba6179e6da61e82418ebd0094eb2890723671d8a43eaf3a53e5cbaadea5ba3eaa065d5b3c60939a7feb4993b0e6000cca8e125f5e40961681cd5cd12fef3c53bff1ac2872f6d835faa92de1729a1f6c9ca5ba887a10;
+  1 encin
+       !99e949b44e949bcbaed6b35d39f94327764bcee5268f6634e4fb0c8a7b8e5c5cdfa9524a7f1fe38c59c65a281093b6ccbfe5e87b3661f5757aa50465b70d65090a1c16563ea62af36e20d1885dcbd100a9bce0f96158b0dc4d0fcbc2ab65658c6d9d2fe7b3abe31f25eba6179e6da61e82418ebd0094eb2890723671d8a43eaf3a53e5cbaadea5ba3eaa065d5b3c60939a7feb4993b0e6000cca8e125f5e40961681cd5cd12fef3c53bff1ac2872f6d835faa92de1729a1f6c9ca5ba887a10
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !28919843d9fd8f617aa87186155b9542fde5014d857c172fb3562e448780d1004f98f5cbbbf3f8d0605f7dec2e73eb48fa3c23d3f191cf82af45363dc364c7dbba5304601a91663171b46e73fb0e48f9a4ea3092091f581d642fb40fa4469227bf7956ad90363e4550df4d73945386c0278a3433d10f4f0381bab8fdc62dd911e3130ef1c68e85d551c9c51be9d8a9ab15237b4ee914e7c04bfa95a0db8db7a9947ab7244d1d371c16d0d31ec354012ae4fd6485fcb590622e2e7e6e49383f92;
+  1 encin
+       !28919843d9fd8f617aa87186155b9542fde5014d857c172fb3562e448780d1004f98f5cbbbf3f8d0605f7dec2e73eb48fa3c23d3f191cf82af45363dc364c7dbba5304601a91663171b46e73fb0e48f9a4ea3092091f581d642fb40fa4469227bf7956ad90363e4550df4d73945386c0278a3433d10f4f0381bab8fdc62dd911e3130ef1c68e85d551c9c51be9d8a9ab15237b4ee914e7c04bfa95a0db8db7a9947ab7244d1d371c16d0d31ec354012ae4fd6485fcb590622e2e7e6e49383f92
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !f521bf3504ddd72a7deb4fbbed98dc1b2793c9eb42593f4ba38724da05396801e219f45c7ce3f98f108ee002166df1206b3625e68c0997cca92c6b46f1f4966fe4be41db01594f936680d9e28f287363969730c9d1f6bff9782a6e5a3d05f3bb756032bb668698b934b50f94b8937602dad9617aaab85799647f96ab6069b06376350b34842a4aa8a874400f61c867cfc49945e964a1fc3da8d924ec800a65b0f83dac752f23eed134fa325586a0780b0988ed827805097fb993af5f25aedfefde;
+  1 encin
+       !f521bf3504ddd72a7deb4fbbed98dc1b2793c9eb42593f4ba38724da05396801e219f45c7ce3f98f108ee002166df1206b3625e68c0997cca92c6b46f1f4966fe4be41db01594f936680d9e28f287363969730c9d1f6bff9782a6e5a3d05f3bb756032bb668698b934b50f94b8937602dad9617aaab85799647f96ab6069b06376350b34842a4aa8a874400f61c867cfc49945e964a1fc3da8d924ec800a65b0f83dac752f23eed134fa325586a0780b0988ed827805097fb993af5f25aedfefde
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !ee153185d4b6438313761f9dd042f1b16af08876cd2ee02a6fa3a89a8910d74b8fe53bf1877483476754556e2b0b2e9f13c483c3daeb2bbb294fb00816eba4a70e93a67aea8b3297684940b5e2ef22724f427334aaa77fd32516b9b888d775178f754e6cd3228ca9190675287abe9e98061868a2ba491b97c3c561f02f1988632be69ace7c37f01f7ef74399d9ba0c9dc8679f8c82823155553c2678a64bba1433b29e6476b2e480873fa512fcfcf3d04b94901cb3e8086671c76cd4168727f0b3fe;
+  1 encin
+       !ee153185d4b6438313761f9dd042f1b16af08876cd2ee02a6fa3a89a8910d74b8fe53bf1877483476754556e2b0b2e9f13c483c3daeb2bbb294fb00816eba4a70e93a67aea8b3297684940b5e2ef22724f427334aaa77fd32516b9b888d775178f754e6cd3228ca9190675287abe9e98061868a2ba491b97c3c561f02f1988632be69ace7c37f01f7ef74399d9ba0c9dc8679f8c82823155553c2678a64bba1433b29e6476b2e480873fa512fcfcf3d04b94901cb3e8086671c76cd4168727f0b3fe
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !188778ec99fa6b7cdbb54ba457d08ec97b0afbccfac8f3adfa0f9d16e1332ebc8a7f826f7f017f5daeff368ec657208ce487b8f42d5e0c002476d71ad4119847082770f95815b07bd779af99cb8c3ad9384fc5513688d0636481bb28306385e63b29576622c017313a7d4e5914c50494b7ebcb1ae9185900437993bf6d0a7777beabc71245301bffa5c99031c67146904c9bb1d8e674562b4cccb6e12f9671cf06efbaaa32e5cc9249ecdefbe8804b88ee86437da83d4e16facccde46a3ce04f5209c1;
+  1 encin
+       !188778ec99fa6b7cdbb54ba457d08ec97b0afbccfac8f3adfa0f9d16e1332ebc8a7f826f7f017f5daeff368ec657208ce487b8f42d5e0c002476d71ad4119847082770f95815b07bd779af99cb8c3ad9384fc5513688d0636481bb28306385e63b29576622c017313a7d4e5914c50494b7ebcb1ae9185900437993bf6d0a7777beabc71245301bffa5c99031c67146904c9bb1d8e674562b4cccb6e12f9671cf06efbaaa32e5cc9249ecdefbe8804b88ee86437da83d4e16facccde46a3ce04f5209c1
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !544bd24c1e8c7658f1c0c577ac0f06bac973fdf62c03ea6e8d83d811a2a91f0fea27f9a3bc62dc7fb8db7f03e37e7d35ace19024207a9ebfe3e5e083fc8b0a992e779db4a3c9844f5f7494bec07450cce78224f69c87ad0dde624a286831f3d4485c397cfc8217a517c8705ebd9d758358bc100b90ab18829bd8cec8a1a49b5b91167cafc7eedeac90cd74610c2f281692ade9f3f442b1f618f8c5ba32cd0380478c05281965301c9b3185094aeeb6bfe071d177fcbaef27812aa978b4b21ae66ee546de;
+  1 encin
+       !544bd24c1e8c7658f1c0c577ac0f06bac973fdf62c03ea6e8d83d811a2a91f0fea27f9a3bc62dc7fb8db7f03e37e7d35ace19024207a9ebfe3e5e083fc8b0a992e779db4a3c9844f5f7494bec07450cce78224f69c87ad0dde624a286831f3d4485c397cfc8217a517c8705ebd9d758358bc100b90ab18829bd8cec8a1a49b5b91167cafc7eedeac90cd74610c2f281692ade9f3f442b1f618f8c5ba32cd0380478c05281965301c9b3185094aeeb6bfe071d177fcbaef27812aa978b4b21ae66ee546de
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !956b768925fd4ddf7a44aac550783d04b77bdc179a635c40e818bf2a5c3a450846ea931ec6ed539e50a586fb52ba11611e44a44c224bcbc757d6828757101788c093dfb0cca10d451de2c87fa50662b2e5272e96f89c6d06ec967f61265d6a06381d5b7b14d669336d28b74bc41b56c03a994901cb80a47470b2fcd2e2ea883c7f83271f3f92ed0e9614d90818440cf44c13ebb84df180e7c281ed6660e6d15d12a9776052b802c3ffaa55ec456bc7fc24130ee00ca84fc140f26a47450475467271fe7270;
+  1 encin
+       !956b768925fd4ddf7a44aac550783d04b77bdc179a635c40e818bf2a5c3a450846ea931ec6ed539e50a586fb52ba11611e44a44c224bcbc757d6828757101788c093dfb0cca10d451de2c87fa50662b2e5272e96f89c6d06ec967f61265d6a06381d5b7b14d669336d28b74bc41b56c03a994901cb80a47470b2fcd2e2ea883c7f83271f3f92ed0e9614d90818440cf44c13ebb84df180e7c281ed6660e6d15d12a9776052b802c3ffaa55ec456bc7fc24130ee00ca84fc140f26a47450475467271fe7270
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !c17edf88f543f4f8f358ef7bc02f696d4afca3b561c9fe4b0110aadcd7d4f63cda8269fd39a69f5d4237644608391df0a336ddbb1f58d7e06d6f9e104287ec366cd3a36eeecafbaf56d565cc7b637f3841db2131d3b386094b8acde4cce3a321474134440781b7c3be99cbf38dbbb149521b510034567ef4f555ca5b4d0ab5f3e9370971b785f863547f600edf2031efaa6e31d4dcafa182a122e63d42e4375bb485fefa4faf9f3796529ad44f77e901f56cfb4f9bc960fb4e210f2425d891cf468a3b297fc5;
+  1 encin
+       !c17edf88f543f4f8f358ef7bc02f696d4afca3b561c9fe4b0110aadcd7d4f63cda8269fd39a69f5d4237644608391df0a336ddbb1f58d7e06d6f9e104287ec366cd3a36eeecafbaf56d565cc7b637f3841db2131d3b386094b8acde4cce3a321474134440781b7c3be99cbf38dbbb149521b510034567ef4f555ca5b4d0ab5f3e9370971b785f863547f600edf2031efaa6e31d4dcafa182a122e63d42e4375bb485fefa4faf9f3796529ad44f77e901f56cfb4f9bc960fb4e210f2425d891cf468a3b297fc5
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  2 copy *0 +;
+  0 encout
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !a9174d658536fdd35fe59babd9680f137e003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf236725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171e2;
+  3 copy *1 +;
+  1 encin
+       !a9174d658536fdd35fe59babd9680f137e003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf236725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171e2
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+
+  ## Some buffering tests.
+  2 begin/ACT *0 +;
+  2 process
+       =XXXXXXXXXXXXXXXXX
+       !a9174d658536fdd35fe59babd9680f137e;
+  2 process
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf23;
+  2 process
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       !6725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171;
+  2 process
+       =X
+       !e2;
+  2 done *0 +;
+
+  3 begin/IACT *0 +;
+  3 process
+       !a9174d658536fdd35fe59babd9680f137e
+       =XXXXXXXXXXXXXXXXX;
+  3 process
+       !003592e3f53e75019ef8147c4ed9e8a68fb125bdfe4b0fb2b583a0dd3d7523b84cc6010b7f694687a51b2aa2d2d48968ce6e07d2c8e831718892a06216a4c2e4038c1b33d1ed75ad212398846dc0119543e8ebaf23
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  3 process
+       !6725adbef7b9444cc98af397536cd494b60d75d4fe93463f0676e8e116cd5d20d6fca42d2e1bb3e524bf50cb44fe7d141147b9239223717e2fcc7baae339cd0e23502bef19345782cffaa5b6d4cad1936f2dbee4257c07e8456a8efc84e58171
+       =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
+  3 process
+       !e2
+       =X;
+  3 done *0 +;
+
+  ## Back to legible tests.
+  0 prf *123 !45476fc0806aee35e864c4f18e6ba62bd3eb1b1e8bef9042b30b0f15d00c3e9f5d5904ab789d4c67eaed582473c15aa4424f11d52b21a296b36db3392e2ecbb2dc6963bafba3b23882d061f1d335e86e470e8d819591bf0c223e24b925751d04f789fc73bc55f7d2b3ed4881c625aa6321d31511b13f6d5e4ce54a;
+  1 prf *123 !45476fc0806aee35e864c4f18e6ba62bd3eb1b1e8bef9042b30b0f15d00c3e9f5d5904ab789d4c67eaed582473c15aa4424f11d52b21a296b36db3392e2ecbb2dc6963bafba3b23882d061f1d335e86e470e8d819591bf0c223e24b925751d04f789fc73bc55f7d2b3ed4881c625aa6321d31511b13f6d5e4ce54a;
+
+  ## MAC verification tests, positive and negative.
+  2 copy *1 +;
+  2 macin !171419608e11e7c907d493209e17f26b +;
+
+  2 copy *1 +;
+  2 begin/ICT *0 +;
+  2 process !171419608e11e7c907d493209e17f26b +;
+  2 done *0 +;
+
+  2 copy *1 +;
+  2 begin/ICT *0 +;
+  2 process !171419608e11e7c970d493209e17f26b +;
+  2 done *0 -;
+
+  2 copy *1 +;
+  2 ad =spong +;
+  2 macin !171419608e11e7c907d493209e17f26b -;
+
+  ## Resume Hamburg's `Concurrence' test.
+  0 macout *16 !171419608e11e7c907d493209e17f26b;
+  1 macin !171419608e11e7c907d493209e17f26b +;
+
+  ## Additional home-grown tests (see `utils/strobe').
+  0 key "=this is my super-secret key" +;
+  1 key "=this is my super-secret key" +;
+
+  0 prf *32 !5418e0f0ee7f982bbbdc2b4bbf49425d0088abfa98ee21d8ad8a3610d15ebb68;
+  1 prf *32 !5418e0f0ee7f982bbbdc2b4bbf49425d0088abfa98ee21d8ad8a3610d15ebb68;
+
+  0 ratchet *32 +;                     1 ratchet *32 +;
+
+  0 macin !b2084ebdfabd50768c91eebc190132cc +;
+  1 macout *16 !b2084ebdfabd50768c91eebc190132cc;
+}
diff --git a/utils/strobe b/utils/strobe
new file mode 100644 (file)
index 0000000..fd0fe57
--- /dev/null
@@ -0,0 +1,147 @@
+#! /usr/bin/python
+
+import catacomb as CAT
+
+I = 1
+A = 2
+C = 4
+T = 8
+M = 16
+INIT = 256
+
+def dump_keccak_state(what, state):
+  buf = CAT.ReadBuffer(state + CAT.ByteString.zero(200 - len(state)))
+  print ";; %s [round 0]" % what
+  print ";; uncomplemented state..."
+  for i in xrange(5):
+    print ";;\t%s" % " ".join(["%016x" % buf.getu64l() for j in xrange(5)])
+  print
+
+class Strobe (object):
+  def __init__(me, sec = 128, _copy = None):
+    if _copy is None:
+      me.k = CAT.Keccak1600()
+      me.r = (1600 - 2*sec)/8
+      me.f = 0
+      me.p0 = 0
+      buf = CAT.WriteBuffer()
+      buf.putu8(1).putu8(me.r)
+      buf.putu8(1).putu8(0)
+      buf.putu8(1).putu8(12*8).put('STROBEv1.0.2')
+      ##dump_keccak_state("init", buf.contents)
+      me.k.mix(buf.contents).step()
+      me.buf = CAT.WriteBuffer()
+      me.mask = me.k.extract(me.r - 2)
+      ##dump_keccak_state("final", me.mask)
+    else:
+      me.k = _copy.k.dup()
+      me.r = _copy.r
+      me.f = _copy.f
+      me.p0 = _copy.p0
+      me.buf = CAT.WriteBuffer().put(_copy.buf.contents)
+      me.mask = me._copy.mask
+
+  def _crank(me):
+    me.buf.putu8(me.p0); me.p0 = 0
+    if me.buf.size == me.r - 1: me.buf.putu8(0x84)
+    else: me.buf.putu8(0x04).zero(me.r - me.buf.size - 1).putu8(0x80)
+    ##dump_keccak_state("buffer", me.buf.contents)
+    ##dump_keccak_state("init", me.buf.contents ^ me.k.extract(me.r))
+    me.k.mix(me.buf.contents).step()
+    me.mask = me.k.extract(me.r - 2)
+    ##dump_keccak_state("final", me.mask)
+    me.buf = CAT.WriteBuffer()
+
+  def process(me, op, input):
+    if not op&T:
+      opf = op
+    else:
+      if not me.f&INIT: me.f |= INIT | (op&I)
+      opf = op ^ (me.f&255)
+    me.buf.putu8(me.p0); me.p0 = me.buf.size
+    if me.buf.size >= me.r - 2: me._crank()
+    me.buf.putu8(opf)
+    if op&C or me.buf.size >= me.r - 2: me._crank()
+
+    if op&(I | T) == I or op&(I | A) == 0: buf = CAT.ByteString.zero(input)
+    else: buf = CAT.ByteString(input)
+    out = CAT.WriteBuffer()
+    i, j, sz = 0, me.buf.size, len(buf)
+
+    while i < sz:
+      spare = me.r - j - 2
+      n = min(spare, sz - i); x = buf[i:i + n]; i += n
+      if not op&C: out.put(x); me.buf.put(x)
+      else:
+        y = x ^ me.mask[j:j + n]; out.put(y)
+        if op&I or not op&T: me.buf.put(y)
+        else: me.buf.put(x)
+      if n == spare: me._crank(); j = 0
+
+    if op&(I | A | C | T) != (I | C | T): return out.contents
+    elif out.contents == CAT.ByteString.zero(out.size): return me
+    else: raise ValueError, 'verify failed'
+
+st0 = Strobe()
+st1 = Strobe()
+
+st0.process(A | M, 'testing')
+st1.process(A | M, 'testing')
+
+print 'prf(10) -> %s' % hex(st0.process(I | A | C, 10))
+st1.process(I | A | C, 10)
+
+print 'ad("Hello")'
+st0.process(A, 'Hello')
+st1.process(A, 'Hello')
+
+c0 = st0.process(A | C | T, 'World');
+st1.process(I | A | C | T, c0)
+print 'encout("World") -> %s' %  hex(c0)
+
+print 'clrout("foo")'
+st0.process(A | T, 'foo');
+st1.process(I | A | T, 'foo')
+
+print 'clrin("bar")'
+st1.process(A | T, 'bar')
+st0.process(I | A | T, 'bar')
+
+m1 = st0.process(I | A | C | T, 'baz')
+st1.process(A | C | T, m1) #  backwards in time
+print 'encin("baz") -> %s' % hex(m1)
+
+for i in xrange(200):
+  c = st0.process(A | C | T, i*'X')
+  m = st1.process(I | A | C | T, c)
+  print "  0 encout\n\t=%s\n\t!%s;" % (i*'X', hex(c))
+  print "  1 encin\n\t!%s\n\t=%s;" % (hex(c), i*'X')
+
+r0 = st0.process(I | A | C, 123)
+r1 = st1.process(I | A | C, 123)
+print 'prf(123) -> %s' % hex(r0)
+assert r0 == r1
+
+t = st0.process(C | T, 16)
+print 'macout(16) -> %s' % hex(t)
+st1.process(I | C | T, t)
+
+k = 'this is my super-secret key'
+print 'key("%s")' % k
+st0.process(A | C, k)
+st1.process(A | C, k)
+
+r0 = st0.process(I | A | C, 32)
+r1 = st1.process(I | A | C, 32)
+print 'prf(32) -> %s' % hex(r0)
+assert r0 == r1
+
+print 'ratchet(32)'
+st0.process(C, 32)
+st1.process(C, 32)
+
+t0 = CAT.bytes('b2084ebdfabd50768c91eebc190132cc')
+st0.process(I | C | T, t0)
+t1 = st1.process(C | T, 16)
+assert t1 == t0
+print 'macin(%s)' % hex(t0)